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

How do I assign specific roles to each user in rails?

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

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

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

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

这个怎么样Gemhttps://github.com/stffn/declarative_authorization/

你可以把它做得非常颗粒化。定义角色,然后您可以相应地分配您的 CURD。它还有一个非常好的辅助方法,您可以使用它们来确定哪个角色在视图或控制器上执行什么任务。

假设基于

  1. 用户通过 AccessList 拥有多个角色
  2. 角色通过AccessList有很多用户
  3. 访问列表属于角色
  4. AccessList 属于用户

这是一张简图(我假设您会处理模型)

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

NOTE: 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