想知道使用acl9管理用户角色的最佳方法是什么?
以下是需要:
以下是问题所在:
我可以在access_control块之外手动检查params:
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.ADMIN、RoleTypes.MANAGER而不是:admin这样的工具是否可行和明智?如果是这样的话,那么最好的方法是什么,并且整个rails应用程序都可以访问这个Class呢?
发布于 2015-03-25 22:28:10
我们如何列出所有的主题角色?:admin,:manager
Role模型只是一个普通的模型,所以您可以像查询其他任何东西一样查询这个模型:
Role.uniq.pluck :name为了保持api端点RESTful,我想在理想情况下传递user_controller更新方法中的角色param。
通常,您最好使用单独的控制器来执行管理,并将其放在Admin::命名空间中,并使用namespace :admin do路由等等。
然后,在该控制器中,您可以使用一个普通的access_control块来确保没有其他人能够进入:
class Admin::UsersController < ApplicationController
access_control do
allow :admin
end
# ...
end因此,是的,您可以通过多种方式设置/更新一个角色,但是作为一个用户可以有许多角色,最好不要有一个:role参数,而是使用:
class User < ActiveRecord::Base
acts_as_authorization_subject
accepts_nested_attributes_for :roles
end那么在你的控制器里你会有:
def user_params
params.require(:user).permit(:first_name, :last_name, roles_attributes: [:name])
end然后,以你的形式,你可以做这样的事情:
= 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_id和authorizable_type,并且需要某种方式来选择要在其中操作的对象。
如何仅授权角色属性,以便用户对象的所有者仍然可以修改他们的first_name、last_name字段,而不能修改他们的角色字段?只有管理员才被允许。
希望您现在已经自己回答了这个问题--通过为管理界面和用户自己的界面使用不同的控制器。
最后,使用诸如RoleTypes.ADMIN、RoleTypes.MANAGER之类的东西而不是:admin是可行和明智的吗?
不,这些符号更简单更好,尽管做这样的事情很常见:
class Role < ActiveRecord::Base
def self.permitted_roles
%i/admin manager foo bar wee/
end
end这样您就可以使用Role.permitted_roles来构造一个复选框数组,或者下拉列表,或者类似的东西。
发布于 2015-03-20 05:22:44
编辑:完全错过了acl9的第一句位-对不起!
尽管如此,我的答案仍然很适用;我会有一个助手方法,或者使用acl9 9的has_role?方法,并在此基础上修改视图。Ie:
>> <% 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找到
最后,您是在问如何查看所有用户角色的列表吗?如果是这样的话,您可以使用下拉菜单,但是您必须在项目中的某个地方对它们进行硬编码,或者遍历每个用户并聚合它们的角色,尽管后者远非理想,而且效率很低。
希望这有帮助,祝你好运!
https://stackoverflow.com/questions/29158991
复制相似问题