【问题标题】:How do I assign specific roles to each user in rails?如何为 Rails 中的每个用户分配特定角色?
【发布时间】:2015-06-17 08:42:30
【问题描述】:

假设有 2 个角色 - 可以管理所有内容的管理员,以及已注册并需要管理员批准他们可以在每个控制器上执行的特定 CRUD 操作的用户。 就像 X 只能创建和阅读文章,而 Y 可以执行更新和删除操作。 我还如何让管理员从网站本身为用户分配这些特定角色?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 roles


    【解决方案1】:

    这个宝石https://github.com/stffn/declarative_authorization/怎么样?

    你可以让它非常颗粒。定义角色,然后您可以相应地分配您的 CURD。它还有一个非常好的 Helper 方法,您可以使用它来确定哪个角色在 View 或 Controller 上执行什么任务。

    假设基于

    1. 用户通过AccessList拥有多个角色
    2. 角色通过AccessList拥有多个用户
    3. AccessList 属于角色
    4. AccessList 属于用户

    这是一个快速的图表(我假设你会照顾模型)

    这是我为 DRY 一些常见任务而制作的模块。

    注意Declarative Authorization 有很多帮助器,以下只是为了补充它们,有些功能可能是多余的,可以重构和编写得更好。它只是一个夜间建造的 :)

    module AuthenticationRelated
      def what_are_current_user_roles
        objArray = []
        current_user.roles.each do |role|
          objArray.push role.name
        end
        return objArray
      end
    
      def does_user_have_this_role?(role_name)
        result = false
        obj_array = what_are_current_user_roles
        obj_array.each do |a_role|
          if a_role == role_name
            result = true
          end
        end
        result
      end
    
      def is_admin?
        athu = false
        if  signed_in?
          current_user.roles.each do |role|
            if role.name == 'admin'
              athu = true
            end
          end
        end
        return athu
      end
    
    
    #  class_instance MUST be a parent class
    # If you need to Authenticate
      def user_allowed_create_and_edit?(class_model, class_instance)
        user_is_allowed = false
        if permitted_to? :create, class_model.new and has_user_own_this(class_instance)
          user_is_allowed = true
        else
          user_is_allowed = false
        end
        # Override everything if user is admin
        if is_admin?
          user_is_allowed = true
        end
    
        return user_is_allowed
    
      end
    
    # Authentication for Builder
    # relation has to be set to access_list
      def has_user_own_this(model)
    
        user_who_owns_this = model.access_list.user_id
        if current_user.id == user_who_owns_this
          return true
        else
          return false
        end
    
      end
    
      def find_current_user_acls
        acl = []
        acls = AccessList.joins(:user).where("users.id = ?",current_user.id)
        acls.each do |an_acl|
         acl.push an_acl.id
        end
        acl
      end
    
    end
    

    【讨论】:

    • 这很有帮助。这张图让一切变得更加清晰。 :)
    • 很高兴它可以提供帮助。如果您需要更多帮助,请告诉我。但这是答案吗?
    • 是的!我实现了它,现在它已经启动并运行了。 :)
    【解决方案2】:

    你应该检查 rolify gem:https://github.com/RolifyCommunity/rolify

    但是如果您只需要 2 个角色(用户和管理员),您可以将新列添加到用户表 :admin, :boolean, default: false,然后您可以签入您的控制器,您可以编写 before_filter 来检查 if @current_user.admin,如果不是重定向或做其他事情。

    在您的视图中,您可以隐藏用于更新和删除unless @current_user.admin的按钮

    【讨论】:

    • 感谢您的链接。其实我想要的是注册用户有不同的能力。例如 X 和 Y 是非管理员,但已注册,具有不同的权限。 X 可以创建、更新和读取所有文章(控制器),但不能删除。 Y 只能读取和删除。管理员可以执行所有操作。其他用户的权限是从某个管理菜单中定义的。你能帮我开始吗?
    • 使用该 gem,您可以声明许多不同的角色。在执行操作之前,您可以检查用户是否具有特定角色。您也可以使用this gem 进行授权。
    • 我通读了文档,似乎 Rolify 有助于为类的实例创建权限。我想要的是对不同用户的特定 CRUD 操作的不同权限。谢谢你的链接。 :)
    猜你喜欢
    • 1970-01-01
    • 2014-12-14
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 2010-10-09
    相关资源
    最近更新 更多