所以我将直奔主题。
我正在使用ActiveAdmin
gem,所以我的应用程序中有AdminUser
模型。现在我从客户那里得到了一个要求,即必须有一个“超级管理员”能够控制其他管理员的权限。
例如,如果我有以下资源:Message
,Client
和Country
,则“超级管理员”应该能够向AdminUser分配管理邮件的任务,另一项任务是管理客户,另一项任务是管理国家。
为此,我正在考虑向boolean
表中添加几个admin_users
属性。例如,将使用名为“ super_admin”的boolean
属性来确定此AdminUser
是否可以更改其他AdminUsers
的权限,使用另一个称为message的属性来确定此{ {1}}可以控制(可以编辑,读取,删除等)消息,另一个名为country的属性可以用来确定此AdminUser
是否可以控制(可以编辑,读取,删除等)。在各个国家等等...
出了什么问题?我无法AdminUser
使用模型中的current_admin_user,所以我无法执行以下操作:
access
那我该怎么办?我必须构建此功能!
答案 0 :(得分:0)
修改 我发现了这个为主动管理员https://github.com/yhirano55/active_admin_role
添加角色的宝藏为什么要在模型中?代码看起来应该放在控制器中,allow_params ...
我会使用专家。我可以看到 can 已在5年前更新。他们很像。
权威回购:https://github.com/varvet/pundit
它使用策略,因此您可以为每个模型创建策略。
class PostPolicy < ApplicationPolicy
def update?
user.admin? or not record.published?
end
end
您可以在其中检查有关更新,创建或显示或其他内容的标志...
在操作中,您使用类似这样的方式授权@post,:update?
引用他们的文档
在这种情况下,您可以想象授权会执行以下操作:
unless PostPolicy.new(current_user, @post).update?
raise Pundit::NotAuthorizedError, "not allowed to update? this #{@post.inspect}"
end
希望这会有所帮助
P.S您需要更复杂的解决方案。我将创建角色模型,在其中可以指定模型,读取,写入权限。我会将其与用户链接到 has_many 角色,然后在我的策略中执行以下操作:
class PostPolicy < ApplicationPolicy
def get_role
user.roles.where(model: "Post").first
end
def update?
user.get_role.write? or not record.published?
end
end
或者在策略模型中也许有更好的方式使用它