Rails 4用户角色和权限

gdi*_*azc 18 ruby authorization ruby-on-rails cancan ruby-on-rails-4

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

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

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

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

And*_*eko 28

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

编辑2015年7月24日

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

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

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

  • 有意思..谢谢..我一定会在未来的项目中尝试Pundit. (2认同)

404*_*404 5

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

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

  # ...
end
Run Code Online (Sandbox Code Playgroud)

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

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

它完全独立于身份验证系统,无需User模型或预定义角色即可运行.您所需要的只是设置当前请求的许可级别:

class ApplicationController < ActionController::Base
  def current_clearance_level
    session[:role] || :guest
  end
end
Run Code Online (Sandbox Code Playgroud)

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

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

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

这里:team指的是TeamsController,只有当前用户被授权访问该edit操作时才会显示该链接TeamsController.它还支持名称空间.

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

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