首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用acl9管理用户及其作为管理员的角色

如何使用acl9管理用户及其作为管理员的角色
EN

Stack Overflow用户
提问于 2015-03-20 03:36:55
回答 2查看 755关注 0票数 2

想知道使用acl9管理用户角色的最佳方法是什么?

以下是需要:

  • 管理员应该能够更新用户的角色。

以下是问题所在:

  1. 我们如何列出所有的主题角色?:admin,:manager
  2. 为了保持api端点RESTful,我想在理想情况下传递user_controller更新方法中的角色param。
  3. 如何仅授权角色属性,以便用户对象的所有者仍然可以修改他们的first_name、last_name字段,而不能修改他们的角色字段?只有管理员才被允许。

我可以在access_control块之外手动检查params:

代码语言:javascript
复制
def secure_params
    if current_user.has_role?(:admin)
        params.require(:user).permit(:first_name, :last_name, :role)
    else
        params.require(:user).permit(:first_name, :last_name)
    end
end

但我想我会检查看看有没有更干净的解决方案。

最后,使用RoleTypes.ADMINRoleTypes.MANAGER而不是:admin这样的工具是否可行和明智?如果是这样的话,那么最好的方法是什么,并且整个rails应用程序都可以访问这个Class呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-25 22:28:10

我们如何列出所有的主题角色?:admin,:manager

Role模型只是一个普通的模型,所以您可以像查询其他任何东西一样查询这个模型:

代码语言:javascript
复制
Role.uniq.pluck :name

为了保持api端点RESTful,我想在理想情况下传递user_controller更新方法中的角色param。

通常,您最好使用单独的控制器来执行管理,并将其放在Admin::命名空间中,并使用namespace :admin do路由等等。

然后,在该控制器中,您可以使用一个普通的access_control块来确保没有其他人能够进入:

代码语言:javascript
复制
class Admin::UsersController < ApplicationController

  access_control do
    allow :admin
  end

  # ...

end

因此,是的,您可以通过多种方式设置/更新一个角色,但是作为一个用户可以有许多角色,最好不要有一个:role参数,而是使用:

代码语言:javascript
复制
class User < ActiveRecord::Base
  acts_as_authorization_subject
  accepts_nested_attributes_for :roles
end

那么在你的控制器里你会有:

代码语言:javascript
复制
def user_params
  params.require(:user).permit(:first_name, :last_name, roles_attributes: [:name])
end

然后,以你的形式,你可以做这样的事情:

代码语言:javascript
复制
= form_for :user do |f|
  = f.text_field :first_name
  = f.text_field :last_name
  = f.fields_for :roles do |fr|
    = fr.text_field :name

请注意,我假设这里只包含简单的角色,而不是对象上的角色,如果您有对象角色,那么您需要一些更复杂的方法来捕获每个角色的authorizable_idauthorizable_type,并且需要某种方式来选择要在其中操作的对象。

如何仅授权角色属性,以便用户对象的所有者仍然可以修改他们的first_name、last_name字段,而不能修改他们的角色字段?只有管理员才被允许。

希望您现在已经自己回答了这个问题--通过为管理界面和用户自己的界面使用不同的控制器。

最后,使用诸如RoleTypes.ADMIN、RoleTypes.MANAGER之类的东西而不是:admin是可行和明智的吗?

不,这些符号更简单更好,尽管做这样的事情很常见:

代码语言:javascript
复制
class Role < ActiveRecord::Base
  def self.permitted_roles
    %i/admin manager foo bar wee/
  end
end

这样您就可以使用Role.permitted_roles来构造一个复选框数组,或者下拉列表,或者类似的东西。

票数 2
EN

Stack Overflow用户

发布于 2015-03-20 05:22:44

编辑:完全错过了acl9的第一句位-对不起!

尽管如此,我的答案仍然很适用;我会有一个助手方法,或者使用acl9 9的has_role?方法,并在此基础上修改视图。Ie:

代码语言:javascript
复制
>> <% if @user.has_role?(:foo, nil) %> 
>>    <p>
>>    <%= f.label :usertype %><br />
>>    <%= f.check_box :usertype %>
>>   </p>
>> <% end %>

我将使用帮助器方法来使用.has_role!方法(即: user.has_role!:some_role,可选作用域)实际设置用户角色,其中用户是分配角色的用户。

有关更多信息,请查看(来自acl9文档):https://github.com/be9/acl9/wiki/Tutorial%3A-securing-a-controller

好的,如果我认为您说的是正确的,那么您希望有一种方法可以让用户编辑内容和/或配置文件信息,但是用户角色可以由管理员编辑。

首先,我将假设角色是用户模式的一部分(如果不是,我建议您考虑将它移到那里)。如果是这样,我建议向用户模型may_edit?(content)中添加一个方法,该方法根据用户角色或id返回布尔值。Ie:

def may_edit?(content) item.user.id == self.id end

其中,内容是通过控制器中的find_by(id)找到的。然后,您可以在控制器中使用一个if来指示显示中将出现哪些内容:

<% if current_user.role == admin %> <%= some button or link or dropdown render %> <% end %> <% if current_user.may_edit?(content) %> <%= some button or link or dropdown render %> <% end %>

或者其他类似的东西。您还可以将if..else作为单独的辅助方法编写,也可以在may_edit?方法中编写(我建议将它/它们建模)。理想情况下,控制器不应该是决定谁能够或不能执行这类事情的人。如果您准备在控制器中执行此操作,则可能需要查看控制器顶部的:before_filter,即:

:before_filter admin?, except [:foo, :bar]

我不确定您想在params中传递哪个用户id,但是可以找到编辑器/管理员的id或原始海报的id-- current_user将以session:user_id的身份登录到会话中,而原始的海报可以通过编辑的内容找到,因为它属于用户,可以通过current_user找到

最后,您是在问如何查看所有用户角色的列表吗?如果是这样的话,您可以使用下拉菜单,但是您必须在项目中的某个地方对它们进行硬编码,或者遍历每个用户并聚合它们的角色,尽管后者远非理想,而且效率很低。

希望这有帮助,祝你好运!

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29158991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档