Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 4用户角色和权限_Ruby On Rails_Ruby_Ruby On Rails 4_Authorization_Cancan - Fatal编程技术网

Ruby on rails Rails 4用户角色和权限

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的兼容

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

例如,只有管理员才能创建、销毁和更新
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