Rails 4用户角色和权限

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

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

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

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

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

编辑2015年7月24日

我已经使用cancancan很长一段时间了,它总是很好用。 我最近改变了工作,在这里他们(我们)使用Pundit进行授权。

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

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

为了控制对操作的访问,我建议使用Action Access ,它归结为:

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

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

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

它完全独立于身份validation系统,无需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 ,因此只有当前用户有权访问TeamsControlleredit操作时TeamsController显示该链接。 它还支持名称空间

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

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

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

适用于设计 。

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

如果您正在使用设计,那么您很幸运,否则您将不得不在项目中添加以下方法:

 user_signed_in? current_user after_sign_in_path_for(current_user) authenticate_user! 

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

 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