在Active Admin中应用基于角色的访问授权的最佳方法是什么?

时间:2018-11-16 09:13:44

标签: ruby ruby-on-rails-4 activeadmin

如果仅使用ActiveAdmin,我知道我可以执行以下操作来限制特定用户组对资源的访问:

ActiveAdmin.register Resource do
  menu :parent => "Super Admin Only", :if => proc { current_admin_user.super_admin? }
end

但是,如果我有一个动态访问/权限控制表单,该表单根据某个用户组的需要进行更新,则我需要能够分别更新我的ActiveAdmin。

我将权限数据另存为json(键值对)。起初,我在考虑使用ActiveAdmin::AuthorizationAdapter

class StaffAuthorization < ActiveAdmin::AuthorizationAdapter

  def authorized?(action, subject = nil)
    return true if resource.try(:name) == 'Dashboard'
    return false if action == :destroy

    retrieve_policy(action).authorized?
  end

  def role
    user.role
  end

  def policy_klass
    "policy/staff/#{role}".classify.constantize
  rescue NameError
    Policy::Staff::Default
  end

  def retrieve_policy(action)
    policy_klass.new(user, resource, action)
  end
end

例如Processing管理员用户:

module Policy::Staff
  class Processing < Base
    def authorized?
      return true if resource.try(:resource_class) == ::Borrow
      return true if resource.try(:resource_class) == ::User && action == :read
      return true if [ 'Reports', 'Categorize' ].include?(resource.try(:name))
      false
    end
  end
end

我总是可以通过在保存时循环遍历json来生成策略文件,但是该函数看起来很脏。始终采用返回true的格式,以获取特定资源或对其的操作。

在ActiveAdmin中做这种功能的更好方法吗?

限制: 运行ActiveAdmin 1.0.0 兰萨克1.8.4

  • 如果我更改/更新这两个中的任何一个,都会得到痛苦的错误清单。

1 个答案:

答案 0 :(得分:0)

我建议使用cancan适配器,该适配器似乎在ActiveAdmin 1.0.0中可用。

首先,通过将throws(是cancancan的后继产品)安装到您的Gemfile中。然后设置适配器:

cancan

然后定义一个config.authorization_adapter = ActiveAdmin::CanCanAdapter 类。

我有这样的事情(从您的示例中借鉴并扩展一点):

app/models/ability.rb

对于cancancan,我的运气一直很好,但是授权比较复杂,但是我还没有尝试使用另一个内置适配器:pundit,所以我不知道它的比较结果。