Ruby on rails Rails 4用户角色和权限
我正在为一个组织编写一个rails应用程序。每个用户可能有一个或多个角色,并且只能根据这些角色访问某些控制器操作 例如,只有管理员才能创建、销毁和更新Ruby on rails Rails 4用户角色和权限,ruby-on-rails,ruby,ruby-on-rails-4,authorization,cancan,Ruby On Rails,Ruby,Ruby On Rails 4,Authorization,Cancan,我正在为一个组织编写一个rails应用程序。每个用户可能有一个或多个角色,并且只能根据这些角色访问某些控制器操作 例如,只有管理员才能创建、销毁和更新Users的某些字段。此外,还有团队,每个团队都有一个团队负责人,只有团队负责人可以更新有关团队的某些信息(例如,成员列表)。但是,管理员是首先分配团队领导的人 我的场景的具体细节并不重要,我只希望我描述了存在许多不同角色和权限的情况 我的问题是:使用什么宝石?我的第一个想法是CanCan,但最后一次提交是在将近一年前,没有提到Rails 4的兼容
User
s的某些字段。此外,还有团队
,每个团队都有一个团队负责人,只有团队负责人可以更新有关团队
的某些信息(例如,成员列表)。但是,管理员是首先分配团队领导的人
我的场景的具体细节并不重要,我只希望我描述了存在许多不同角色和权限的情况
我的问题是:使用什么宝石?我的第一个想法是CanCan,但最后一次提交是在将近一年前,没有提到Rails 4的兼容性。目前是否有其他选择?您的第一个猜测是正确的,使用它,您会很好地使用它
2015年7月24日编辑
我已经使用cancancan很长一段时间了,它一直工作得很好。我最近开始从事一个用于授权的项目
太棒了。它会提示您为每个资源定义策略,这比一个臃肿的能力类感觉更自然
对于更大的项目,我肯定会推荐Pundit。为了控制对我推荐的操作的访问,可以归结为以下几点:
class UsersController < ApplicationController
let :admin, :all
let :user, [:index, :show]
# ...
end
您可以在此处返回应用程序所需的任何内容,例如当前用户.role
虽然它不是必需的,但它捆绑了一组方便的模型添加,允许执行以下操作:
<% if current_user.can? :edit, :team %>
<%= link_to 'Edit team', edit_team_path(@team) %>
<% end %>
此处:team
指的是TeamsController
,因此只有当前用户有权访问TeamsController
中的编辑
操作时,才会显示该链接。它还支持名称空间
默认情况下,您可以锁定控制器、自定义重定向路径和警报消息等
它非常简单明了,我希望你会发现它很有用。有人向我建议,我们现在使用的是gem。易于使用,外观非常干净,具有极佳的导轨感
与其他人合作很好
下面是自述文件中的一些示例
如果您正在使用Desive,那么您很幸运,否则您将不得不在项目中添加以下方法:
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
是坎坎的延续。最后一次提交是在4天前。这是一个寻找宝石的好地方。它显示宝石是否活着。哦!我早该知道社区会为此付出代价的!有意思。。非常感谢。我肯定会在我未来的项目中尝试一下Pundit。请注意,使用session[:role]
存储用户的有效访问级别对于Rails应用程序来说是非常危险的,因为Rails默认情况下会在浏览器cookie中存储会话信息。用户可以轻松地宣传自己。
access all: [:show, :index], user: {except: [:destroy]}, company_admin: :all