class Lolita::Extensions::Authorization::PunditAdapter

Public Class Methods

new(context, options={}) click to toggle source
# File lib/lolita/extensions/authorization/pundit_adapter.rb, line 6
def initialize context, options={}
  raise NameError, "Pundit is not defined" unless defined?(Pundit)
  raise Lolita::NoAuthorizationDefinedError, "Lolita.authorization is not defined" unless Lolita.authorization
  @context = context
  @options = options
  current_ability
end

Public Instance Methods

authorize!(*args) click to toggle source
# File lib/lolita/extensions/authorization/pundit_adapter.rb, line 30
def authorize! *args
  unless ability = current_ability(*args) and ability.public_send(policy_method(args))
    raise Pundit::NotAuthorizedError.new("not allowed to #{args.first} this #{args.last}")
  end
  true
end
can?(*args) click to toggle source
# File lib/lolita/extensions/authorization/pundit_adapter.rb, line 14
def can? *args
  !!(ability = current_ability(*args) and ability.send(policy_method(args)))
end
cannot?(*args) click to toggle source
# File lib/lolita/extensions/authorization/pundit_adapter.rb, line 18
def cannot? *args
  !can?(*args)
end
current_ability(*args) click to toggle source
# File lib/lolita/extensions/authorization/pundit_adapter.rb, line 22
def current_ability *args
  if current_user && record = get_record(*args)
    @current_ability = Pundit.policy(current_user, record) || Lolita.policy_class.new(current_user, record)
    @context && @context.instance_variable_set(:"@current_ability", @current_ability)
  end
  @current_ability
end

Private Instance Methods

current_user() click to toggle source
# File lib/lolita/extensions/authorization/pundit_adapter.rb, line 39
def current_user
  @context && @context.authentication_proxy.current_user
end
get_record(*args) click to toggle source
# File lib/lolita/extensions/authorization/pundit_adapter.rb, line 43
def get_record *args
  if args.any?
    record_as_instance(args.last)
  else
    mapping = @options[:request].env["lolita.mapping"] and mapping.class_name.constantize
  end
end
is_instance?(obj) click to toggle source
# File lib/lolita/extensions/authorization/pundit_adapter.rb, line 71
def is_instance? obj
  !obj.respond_to? :ancestors
end
is_module?(obj) click to toggle source
# File lib/lolita/extensions/authorization/pundit_adapter.rb, line 68
def is_module? obj
  obj.class == Module
end
policy_method(args) click to toggle source
# File lib/lolita/extensions/authorization/pundit_adapter.rb, line 51
def policy_method args
  "#{args.first}?"
end
record_as_instance(record) click to toggle source

pundit can receive only instance as record, but Lolita can give sometime instance sometimes class or module, so we try to make it as instance

# File lib/lolita/extensions/authorization/pundit_adapter.rb, line 58
def record_as_instance record
  if is_instance?(record)
    record
  elsif is_module?(record)
    Object.new
  else
    record.new
  end
end