Module: ConcernsOnRails::Controllers::Authorizable::ClassMethods

Defined in:
lib/concerns_on_rails/controllers/authorizable.rb

Instance Method Summary collapse

Instance Method Details

#authorize_by(only: nil, except: nil, status: :forbidden, message: "Forbidden", &block) ⇒ Object

Register an authorization predicate. ‘only:`/`except:` scope it to a subset of actions (mutually exclusive). `status:` (default :forbidden) and `message:` control the denial response.

Raises:

  • (ArgumentError)


37
38
39
40
41
# File 'lib/concerns_on_rails/controllers/authorizable.rb', line 37

def authorize_by(only: nil, except: nil, status: :forbidden, message: "Forbidden", &block)
  raise ArgumentError, "ConcernsOnRails::Controllers::Authorizable: a block is required" unless block

  add_authorization_rule(check: block, only: only, except: except, status: status, message: message)
end

#require_role(*roles, via: :current_user, role_method: :role, only: nil, except: nil, status: :forbidden, message: "Forbidden") ⇒ Object

Sugar for the common “actor must have one of these roles” rule. The actor is read via ‘via:` (default `:current_user`) and its role via `role_method:` (default `:role`). Implemented as a proc, never a lambda, so arity slicing can’t raise.

Raises:

  • (ArgumentError)


47
48
49
50
51
52
53
54
55
56
57
# File 'lib/concerns_on_rails/controllers/authorizable.rb', line 47

def require_role(*roles, via: :current_user, role_method: :role, only: nil, except: nil,
                 status: :forbidden, message: "Forbidden")
  raise ArgumentError, "ConcernsOnRails::Controllers::Authorizable: at least one role is required" if roles.empty?

  wanted = roles.map(&:to_s)
  check = proc do
    actor = respond_to?(via) ? send(via) : nil
    actor.respond_to?(role_method) && wanted.include?(actor.public_send(role_method).to_s)
  end
  add_authorization_rule(check: check, only: only, except: except, status: status, message: message)
end