【问题标题】:Permissions and roles stored in DB, rails 3.1存储在数据库中的权限和角色,rails 3.1
【发布时间】:2012-01-20 03:39:39
【问题描述】:

在我的应用程序中,我想以这样的方式实现角色和权限,用户管理员可以在他们的浏览器中创建新角色。所以我需要权限表和角色表,其中每个角色都是权限的组合。现在我使用 CanCan gem,但是这个 gem 不是默认行为,最后我得到了非常复杂的角色结构和检查权限。谁能告诉我是什么 gem 提供了这种行为,或者我应该在没有任何 gem 的情况下实现它?

【问题讨论】:

    标签: ruby-on-rails-3 permissions authorization roles


    【解决方案1】:

    请参阅 CanCan wiki 中的 Abilities in DatabaseAbility for Other Users

    class Ability
      include CanCan::Ability
    
      def initialize(user)
        can do |action, subject_class, subject|
          user.permissions.find_all_by_action(aliases_for_action(action)).any? do |permission|
            permission.subject_class == subject_class.to_s &&
              (subject.nil? || permission.subject_id.nil? || permission.subject_id == subject.id)
          end
        end
      end
    end
    

    编辑
    一些负载优化:

    class Ability
      include CanCan::Ability
    
      def initialize(user, context = nil)
        if context.nil?
          can do |action, subject_class, subject|
            user.permissions.find_all_by_action(aliases_for_action(action)).any? do |permission|
              permission.subject_class == subject_class.to_s &&
               (subject.nil? || permission.subject_id.nil? || permission.subject_id == subject.id)
          end
        elsif context == :post
          can :manage, Post, :id => y
        elsif context == :users
          can :manage, User, :id => x
        end
      ...
    

    在控制器中:

    class UsersController
      protected
      def current_ability
        Ability.new(current_user, :users)
    
    class PostsController
      protected
      def current_ability
        Ability.new(current_user, :posts)
    

    【讨论】:

    • 是的,我现在是这样实现的,但是在页面加载时它对 DB 的请求太多。我想知道有没有更合适的方法来做到这一点。
    • 您可以在内存中创建权限表,或者将第二个上下文变量传递给能力构造函数,并根据上下文根据上下文急切加载权限并使用经典 CanCan 定义它们
    • 我认为这是最简单的方法..应该这样做。谢谢
    猜你喜欢
    • 2014-02-03
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    相关资源
    最近更新 更多