【发布时间】:2018-11-16 09:13:43
【问题描述】:
如果只使用 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 adminuser:
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
- 如果我更改/更新这两个中的任何一个,我会得到令人痛苦的错误列表。
【问题讨论】:
标签: ruby ruby-on-rails-4 activeadmin