【问题标题】:Rails 4 user roles and permissionsRails 4 用户角色和权限
【发布时间】:2019-03-25 17:07:10
【问题描述】:

我正在为一个组织编写一个 Rails 应用程序。每个用户可能有 1 个或多个角色,并且只能根据这些角色访问某些控制器操作。

例如,只有 admins 可以创建、销毁和更新Users 的某些字段。此外,还有Teams,每个@s都有一个团队负责人,并且只有团队负责人可以更新有关Team的某些信息(如成员列表,对于例子)。但是,Admins 是首先指定团队领导的人。

我的场景的具体细节并不重要,我只是希望我描述了有许多不同角色和权限的情况。

我的问题是:使用什么宝石?我的第一个想法是 CanCan,但最后一次提交几乎是一年前,并没有提到 Rails 4 的兼容性。是否有当前维护的替代方案?

【问题讨论】:

  • CanCanCan是CanCan的延续。上次提交 4 天前。
  • Ruby toolbox 是搜索宝石的好地方。它显示宝石是否还活着。
  • 哦!我应该知道社区会分叉它!

标签: ruby-on-rails ruby ruby-on-rails-4 authorization cancan


【解决方案1】:

您的第一个猜测是正确的,使用cancancan,您会很顺利的。

2015 年 7 月 24 日编辑

我已经使用 cancancan 很长时间了,它一直都很好用。我最近开始做一个项目,Pundit 用于授权。

太棒了。它会提示您为每个资源定义策略,感觉比一个臃肿的能力类更自然。

对于更大的项目,我肯定会推荐 Pundit。

【讨论】:

  • 有趣.. 谢谢.. 我一定会在我未来的项目中尝试 Pundit。
【解决方案2】:

要控制对操作的访问,我建议 Action Access,归结为:

class UsersController < ApplicationController
  let :admin, :all
  let :user, [:index, :show]

  # ...
end

这将自动锁定控制器,允许管理员访问每个操作,用户仅用于显示或索引用户,其他任何人都将被拒绝并通过警报重定向。

如果您需要更多控制,可以使用not_authorized! 内部操作来检查和拒绝访问。

它完全独立于身份验证系统,它可以在没有User 模型或预定义角色的情况下工作。您只需为当前请求设置许可级别:

class ApplicationController < ActionController::Base
  def current_clearance_level
    session[:role] || :guest
  end
end

您可以在此处返回应用所需的任何内容,例如 current_user.role

虽然不是必需的,但它捆绑了一组方便的模型添加,允许执行以下操作:

<% if current_user.can? :edit, :team %>
  <%= link_to 'Edit team', edit_team_path(@team) %>
<% end %>

这里:team指的是TeamsController,所以只有当前用户被授权访问TeamsController中的edit动作时才会显示链接。它还支持命名空间

您可以默认锁定控制器,自定义重定向路径和警报消息等。

它非常简单明了,希望对你有用。

【讨论】:

  • 请注意,使用session[:role] 存储有效的用户访问级别对于Rails 应用程序来说是非常危险的,因为Rails 默认将会话信息存储在浏览器cookie 中。用户可以轻松地宣传自己。
【解决方案3】:

我们现在使用的建议是petergate gem。易于使用,外观非常干净,导轨感觉很棒。

适用于devise

以下是自述文件中的一些示例。

如果您使用的是设计,那么您很幸运,否则您必须在项目中添加以下方法:

user_signed_in?
current_user
after_sign_in_path_for(current_user)
authenticate_user! 

这在您的 User.rb 中。添加更多角色就像将它们添加到数组一样简单。

petergate(roles: [:admin, :editor], multiple: false)

实例方法

user.role => :editor
user.roles => [:editor, :user]
user.roles=(v) #sets roles
user.available_roles => [:admin, :editor]
user.has_roles?(:admin, :editors) # returns true if user is any of roles passed in as params.

控制器访问语法。

access all: [:show, :index], user: {except: [:destroy]}, company_admin: :all

【讨论】:

    猜你喜欢
    • 2016-12-04
    • 2011-06-25
    • 2020-10-20
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 2014-08-08
    • 2020-10-18
    • 2015-11-26
    相关资源
    最近更新 更多