Rails 4用户角色和权限

时间:2014-08-12 19:51:32

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

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

例如,只有 admins 可以创建,销毁和更新User s的某些字段。此外,还有Team个,每个人都有团队负责人,只有团队负责人可以更新有关Team的某些信息(如成员列表,例如)。但是,Admins是首先分配团队负责人的人。

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

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

3 个答案:

答案 0 :(得分:28)

你的第一个猜测是正确的,使用cancancan,你就会很好。

编辑2015年7月24日

我已经使用cancancan很长一段时间了,它总是很好用。我最近开始研究一个Pundit用于授权的项目。

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

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

答案 1 :(得分:5)

要控制对我推荐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,因此只有当前用户有权访问edit中的TeamsController操作时,才会显示该链接。它还支持名称空间

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

它非常简单易行,我希望你觉得它很有用。

答案 2 :(得分:2)

我建议使用的是petergate宝石。易于使用,外观非常干净,具有良好的导轨感。

适用于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