如果仅使用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
答案 0 :(得分:0)
我建议使用cancan适配器,该适配器似乎在ActiveAdmin 1.0.0中可用。
首先,通过将throws
(是cancancan
的后继产品)安装到您的Gemfile中。然后设置适配器:
cancan
然后定义一个config.authorization_adapter = ActiveAdmin::CanCanAdapter
类。
我有这样的事情(从您的示例中借鉴并扩展一点):
app/models/ability.rb
对于cancancan,我的运气一直很好,但是授权比较复杂,但是我还没有尝试使用另一个内置适配器:pundit,所以我不知道它的比较结果。