Class: DecisionAgent::Auth::PunditAdapter

Inherits:
RbacAdapter
  • Object
show all
Defined in:
lib/decision_agent/auth/rbac_adapter.rb

Overview

Adapter for Pundit authorization

Instance Method Summary collapse

Methods inherited from RbacAdapter

#active?, #user_email, #user_id

Instance Method Details

#can?(user, permission, resource = nil) ⇒ Boolean

Returns:



165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
# File 'lib/decision_agent/auth/rbac_adapter.rb', line 165

def can?(user, permission, resource = nil)
  return false unless user
  return false unless active?(user)

  # Pundit uses policy classes
  if resource.respond_to?(:policy_class)
    policy = resource.policy_class.new(user, resource)
    action = map_permission_to_action(permission)
    policy.respond_to?(action) && policy.public_send(action)
  elsif resource
    # Try to infer policy class from resource
    policy_class_name = "#{resource.class.name}Policy"
    if Object.const_defined?(policy_class_name)
      policy_class = Object.const_get(policy_class_name)
      policy = policy_class.new(user, resource)
      action = map_permission_to_action(permission)
      policy.respond_to?(action) && policy.public_send(action)
    else
      false
    end
  else
    false
  end
end

#has_role?(user, role) ⇒ Boolean

Returns:



190
191
192
193
194
195
196
197
198
199
200
201
# File 'lib/decision_agent/auth/rbac_adapter.rb', line 190

def has_role?(user, role)
  return false unless user
  return false unless active?(user)

  if user.respond_to?(:has_role?)
    user.has_role?(role)
  elsif user.respond_to?(:roles)
    user.roles.any? { |r| r.to_s == role.to_s || r.name.to_s == role.to_s }
  else
    false
  end
end