alo*_*ony 15 ruby roles ruby-on-rails
我需要在我的Rails应用程序中创建基于角色的权限系统.我会对CanCan感到非常满意,但主要问题是 - 它必须是动态的,因此管理员必须能够分配权限并创建新角色.权限可以是简单的控制器/操作限制,并且可以是数据相关的,例如一些用户可以仅编辑他们自己的配置文件,并且其中一些用户可以编辑特定组中的所有用户的配置文件.允许管理员创建新权限真的很不错.
我正在考虑的是在db中存储一个控制器/动作,以及一些与数据相关的限制(我真的很困惑这里定义它们的方式).那么请你给我一些建议,组织权限的最佳方法是什么?
任何想法都非常感激
小智 20
如果您喜欢CanCan,那么我认为最好使用它.这是一个关于在数据库中存储能力的简短教程,以便非程序员可以更新它们:
https://github.com/ryanb/cancan/wiki/Abilities-in-Database
如果你真的,真的想自己实现这样的系统.根据您的需要,我建议您尽可能简单地实施.
在这种情况下,您只需要用户访问模块(某些控制器).你可以做:
1)将所有用户权限存储在序列化字段中 - > http://apidock.com/rails/ActiveRecord/Base/serialize/class
class User
serialize :permissions, Array
def access_to?(module)
permissions.include? module.to_s
end
end
Run Code Online (Sandbox Code Playgroud)
设置这个字段时会检查一下.
2)如果当前用户可以访问该控制器,只需在每个控制器的顶部进行检查(部分)
class ApplicationController
private
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
endposible
end
class AdminNewsController
require_access_to :news
end
Run Code Online (Sandbox Code Playgroud)
当然,这只是一个起始位置,您可以从中轻松发展.
[ 编辑 @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
Run Code Online (Sandbox Code Playgroud)
其中scope
返回类似这样:all
的nil
范围,或Object.const_get(@scope_name)
以其他方式...玩它.无论如何,它是可行的.
更复杂的CanCan事情可能会更复杂(duh) - 例如条件权限 - 但这也是一个管理婊子,所以我认为这应该足够大多数应用程序.