Module: ConcernsOnRails::Controllers::Authorizable::ClassMethods
- Defined in:
- lib/concerns_on_rails/controllers/authorizable.rb
Instance Method Summary collapse
-
#authorize_by(only: nil, except: nil, status: :forbidden, message: "Forbidden", &block) ⇒ Object
Register an authorization predicate.
-
#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.
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.
37 38 39 40 41 |
# File 'lib/concerns_on_rails/controllers/authorizable.rb', line 37 def (only: nil, except: nil, status: :forbidden, message: "Forbidden", &block) raise ArgumentError, "ConcernsOnRails::Controllers::Authorizable: a block is required" unless block (check: block, only: only, except: except, status: status, 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.
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 (check: check, only: only, except: except, status: status, message: ) end |