Rails应用程序中的动态角色和权限系统

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)

当然,这只是一个起始位置,您可以从中轻松发展.


Ama*_*dan 5

[ 编辑 @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返回类似这样:allnil范围,或Object.const_get(@scope_name)以其他方式...玩它.无论如何,它是可行的.

更复杂的CanCan事情可能会更复杂(duh) - 例如条件权限 - 但这也是一个管理婊子,所以我认为这应该足够大多数应用程序.