class Rolypoly::RoleGatekeeper
Attributes
actions[RW]
all_actions[RW]
public[RW]
resource[RW]
roles[R]
Public Class Methods
new(roles, actions, resource = nil)
click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 5 def initialize(roles, actions, resource = nil) self.roles = Set.new Array(roles).map(&:to_s) self.actions = Set.new Array(actions).map(&:to_s) self.resource = resource self.all_actions = false self.public = false end
Public Instance Methods
action?(check_actions)
click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 111 def action?(check_actions) check_actions = Set.new Array(check_actions).map(&:to_s) all_actions? || !(check_actions & actions).empty? end
all_public()
click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 67 def all_public self.public = true self.all_actions = true end
allow(*roles)
click to toggle source
on(resource).allow(*roles).to_access(*actions)
# File lib/rolypoly/role_gatekeeper.rb, line 19 def allow(*roles) to(*roles) self end
allow?(current_roles, action, options = {})
click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 58 def allow?(current_roles, action, options = {}) action?(action) && role?(current_roles, options) end
allowed_roles(current_roles, action, options = {})
click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 62 def allowed_roles(current_roles, action, options = {}) return [] if public? || !action?(action) match_roles(current_roles, options) end
initialize_copy(other)
click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 13 def initialize_copy(other) @roles = @roles.dup @actions = @actions.dup end
on(resource)
click to toggle source
allow(*roles).on(resource).to_access(*actions)
# File lib/rolypoly/role_gatekeeper.rb, line 31 def on(resource) self.resource = resource self end
public?()
click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 116 def public? !!public end
restrict(*actions)
click to toggle source
on(resource).restrict(*actions).to(*roles)
# File lib/rolypoly/role_gatekeeper.rb, line 25 def restrict(*actions) to_access(*actions) self end
role?(check_roles, options = {})
click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 72 def role?(check_roles, options = {}) return true if public? required_resource = find_required_resource(options) Array(check_roles).any? do |check_role| allowed_role?(check_role) && allowed_resource?(check_role, required_resource) end end
to(*roles)
click to toggle source
restrict(*actions).to *roles
# File lib/rolypoly/role_gatekeeper.rb, line 37 def to(*roles) self.roles = self.roles.merge roles.flatten.compact.map(&:to_s) end
to_access(*actions)
click to toggle source
allow(*roles).to_access *actions
# File lib/rolypoly/role_gatekeeper.rb, line 48 def to_access(*actions) self.actions = self.actions.merge actions.flatten.compact.map(&:to_s) end
to_all()
click to toggle source
allow role access to all actions allow(*roles).to_all
# File lib/rolypoly/role_gatekeeper.rb, line 54 def to_all self.all_actions = true end
to_none()
click to toggle source
make actions public basically restrict(:index).to_none
# File lib/rolypoly/role_gatekeeper.rb, line 43 def to_none self.public = true end
Private Instance Methods
all_actions?()
click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 141 def all_actions? !!all_actions end
allowed_resource?(check_role, required_resource)
click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 85 def allowed_resource?(check_role, required_resource) return true unless require_resource? case required_resource when ->(r) { r.is_a?(Hash) && r.keys == [:resource_type] } check_role.respond_to?(:resource_type) && check_role.resource_type == required_resource[:resource_type] when Hash, ->(r) { type_id_resource?(r) } check_role.respond_to?(:resource?) && check_role.resource?(required_resource) else check_role.respond_to?(:resource?) && Array(required_resource).any? {|r| check_role.resource?(r) } end end
allowed_role?(role_object)
click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 135 def allowed_role?(role_object) role_string = role_object.respond_to?(:to_role_string) ? role_object.to_role_string : role_object.to_s roles.include?(role_string.to_s) end
find_required_resource(options = {})
click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 105 def find_required_resource(options = {}) return resource unless %w(String Symbol).include?(resource.class.to_s) options[resource] end
match_roles(check_roles, options = {})
click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 127 def match_roles(check_roles, options = {}) required_resource = find_required_resource(options) Array(check_roles).select do |check_role| allowed_role?(check_role) && allowed_resource?(check_role, required_resource) end end
require_resource?()
click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 81 def require_resource? !!resource end
type_id_resource?(required_resource)
click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 101 def type_id_resource?(required_resource) required_resource.is_a?(Array) && %w(String Symbol).include?(required_resource.first.class.name) end