如何为rails中的每个用户分配特定角色?

时间:2015-06-16 14:15:19

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

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

2 个答案:

答案 0 :(得分:0)

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

但是如果您只想要2个角色(用户和管理员),则可以向用户表:admin, :boolean, default: false添加新列,然后您可以签入控制器,您可以编写before_filter来检查{{1}如果没有,它会重定向或者使用其他内容。

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

的按钮

答案 1 :(得分:0)

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

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

假设基于

  1. 用户通过AccessList有很多角色
  2. 角色通过AccessList有很多用户
  3. AccessList属于角色
  4. AccessList属于用户
  5. 这是一个快速的数据库(我假设您将负责模型)

    enter image description here

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

    注意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