我正在为组织编写rails应用程序。每个用户可能有一个或多个角色,并且只能根据这些角色访问某些控制器操作。
例如,只有管理员可以创建,销毁和更新User
s的某些字段。此外,还有Team
s,每个都有一个团队领导,只有团队负责人可以更新有关Team
的某些信息(例如,成员列表)。然而,Admins
是首先指派团队领导者的人。
我的场景的具体细节并不重要,我只希望我描述了有许多不同角色和权限的情况。
我的问题是:使用什么宝石?我的第一个想法是CanCan,但最近一次提交是差不多一年前的事情,并没有提到Rails 4的兼容性。目前有替代方案吗?
为了控制对行动的访问,我建议使用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
动作时才会显示该链接。它还支持名称空间。
您可以默认锁定控制器,自定义重定向路径和警报消息等。
这非常简单易行,我希望你觉得它很有用。
我建议使用的东西是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