Rails 应用程序中的动态角色和权限系统
Posted
技术标签:
【中文标题】Rails 应用程序中的动态角色和权限系统【英文标题】:Dynamic roles and permissions system in Rails app 【发布时间】:2012-02-04 03:05:20 【问题描述】:我需要在我的 Rails 应用程序中创建基于角色的权限系统。我会对 CanCan 感到非常满意,但主要问题是 - 它必须是动态的,因此管理员必须能够分配权限并创建新角色。权限可以是简单的控制器/操作限制,并且可以是数据相关的,例如一些用户只能编辑他们自己的配置文件,而其中一些可以编辑特定组中所有用户的配置文件。如果允许管理员创建新权限,那就太好了。
我正在考虑的是在 db 中存储一个控制器/动作,以及一些与数据相关的限制(我在这里真的很困惑如何定义它们)。那么您能否给我一些建议,组织权限的最佳方式是什么?
任何想法都非常感谢
【问题讨论】:
【参考方案1】:如果你喜欢CanCan,那么我认为最好使用它。这是一个关于在数据库中存储能力以便非程序员可以更新它们的简短教程:
https://github.com/ryanb/cancan/wiki/Abilities-in-Database
如果你真的,真的想自己实现这样的系统。根据您的需要,我会建议您尽可能简单地实现它。
如果您只需要用户可以访问模块(某些控制器)。你可以这样做:
将所有用户权限存储在序列化字段中 -> http://apidock.com/rails/ActiveRecord/Base/serialize/class
类用户 序列化:权限,数组
def access_to?(模块) 权限.包括?模块.to_s 结尾 结束
设置此字段时进行一些检查会很好。
如果当前用户有权访问此控制器(部分),只需检查每个控制器的顶部
类 ApplicationController 私人的
def self.require_access_to(module)
before_filter do |c|
unless c.send(:current_user).try :access_to?(module)
c.send :render_no_presmissions_page
end
end
end
结束
类 AdminNewsController require_access_to :新闻 结束
当然这只是一个起点,你可以从这里轻松进化。
【讨论】:
CanCan 项目被放弃。新项目是CanCanCan。教程为:github.com/CanCanCommunity/cancancan/wiki/Abilities-in-Database @DR.Somar 是的。康康被抛弃了。 Pundit 是很多更好的方法。我一直在为此开发自己的名为 KittyPolicy 的库 - github.com/producthunt/kitty-policy【参考方案2】:[EDIT@RadoslavStankov 给出的链接比这更好。]
您可以使用 CanCan 轻松完成。只需为权限创建一个模型(has_and_belongs_to_many :users
),然后在您的Ability#initialize
中从模型中加载适合用户的权限,并说用户can
执行它们。然后制作适当的用户界面来管理该模型。
类似这样的:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
user.permissions.each do |permission|
can permission.symbol, permission.scope
end
user.prohibitions.each do |permission|
cannot permission.symbol, permission.scope
end
end
end
其中scope
为nil
范围返回了类似:all
的内容,或者Object.const_get(@scope_name)
否则......玩它。无论如何,这是可行的。
更复杂的 CanCan 事情可能更复杂(呃) - 例如条件权限 - 但管理起来也很麻烦,所以我认为这对于大多数应用程序来说应该足够了。
【讨论】:
以上是关于Rails 应用程序中的动态角色和权限系统的主要内容,如果未能解决你的问题,请参考以下文章