我考虑的是将控制器/操作和一些数据相关的限制存储在数据库中(我对定义方法感到困惑)。所以请给我一些建议,如何最好地组织权限?
非常感谢您的任何想法。
如果你喜欢CanCan,我认为最好使用它。这是一个简短的教程,介绍如何将权限存储在数据库中,以便非程序员可以更新它们:
https://github.com/ryanb/cancan/wiki/Abilities-in-Database
如果你真的想要自己实现这样的系统。根据你的需求,我建议你将其尽可能简单地实现。
如果你只需要用户访问某些模块(特定的控制器),你可以这样做:
像序列化字段一样存储所有用户权限-> http://apidock.com/rails/ActiveRecord/Base/serialize/class
class User serialize :permissions, Array
def access_to?(module) permissions.include? module.to_s end end
在设置此字段时进行一些检查会很好。
只需在每个控制器的顶部进行检查,看当前用户是否有访问该控制器(部分)的权限
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
end
结尾
管理员新闻控制器 需要访问权限 : 新闻 结束
当然,这只是一个起点,您可以从这里轻松发展。
[编辑 @RadoslavStankov提供的链接比这个更好。]
你可以很容易地使用CanCan来完成它。只需为权限创建一个模型(其中has_and_belongs_to_many:users
),并在你的Ability#initialize
中从模型中加载适合用户的权限,并说用户可以执行它们。然后创建适当的用户界面来管理该模型。
类似于这样:
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
当 nil
范围返回类似于 :all
的内容时,或者否则返回 Object.const_get(@scope_name)
... 玩一下。无论如何,这是可行的。
更复杂的 CanCan 事物可能会更加复杂(傻瓜)-例如条件权限-但这也将是一个麻烦的管理问题,因此我认为这对于大多数应用程序来说应该足够了。