您好我正在使用rolify并且刚刚意识到我并没有真正利用它的全部潜力。
目前我正在我的控制器中做事情,比如current_user.has_role? :whatever_role
重新路由用户,并允许用户有任何其他角色......
有人问关于rolvert的stackoverflow问题,当我试图回答它时,我意识到我做错了。
现在,我的混乱开始了......在ability.rb里面我有:
user ||= User.new # guest user (not logged in)
if user.has_role? :consumer
can :manage, Review
else
can :read, Review
end
现在假设我将使用者角色添加到用户:
x=User.last
x.add_role :consumer
# => #<Role id: 10, name: "consumer", resource_id: nil, resource_type: nil, created_at: "2013-04-18 23:00:46", updated_at: "2013-04-18 23:00:46">
是的,所以创建了角色。我可以通过这样做来检查:
x.has_role? :consumer
=> true
现在我希望这能为评论提供管理能力......
x.has_role? :consumer, Review
=> true
但不适用于其他型号......我在这里尝试产品
x.has_role? :consumer, Product
=> true
此外,当我查看“资源角色查询”并尝试查询应用的评论角色时,我发现没有应用角色:
Review.first.applied_roles
=> []
有人可以向我解释一下。感谢
答案 0 :(得分:30)
我的回答,从this reddit post:
中提出问题 身份验证正在确定User
他们声称自己是谁。
授权确定User
可以在他们确定身份后执行指定的操作,无论是阅读还是写作。
角色只是用户之间授权的常见模式:此User
可以授权,即{{1}可以像这样授权而不是。
此处缺少的成分是权限:已建立的User
与某些控制器操作之间的关系。
Role
他们自己对Roles
可以执行的操作没有任何承诺。请记住 - 授权就是行动。 User
概括了您正在处理的Roles
。它们的存在是为了让您不必查询每个User
的{{1}}巨额清单。他们声明:此User
是Permissions
!当然他们有User
来做到这一点!
Role
种类很多。如果您希望足够的授权 Permission
能够编辑它们,您可以将它们存储在数据库中,如果您的Permission
也应该是可配置的,则可以将它们存储在数据库中。或者,如果您的Users
Roles
足够静态,您可以使用Ruby代码提前管理User's
:
当我想要配置Roles
和Permissions
时,即对于您在完成合同时交给某人的客户端应用程序,我实现了Roles
和使用我自己的自定义模型Permissions
,然后在我的User :has_many Roles
中添加Role :has_many Permissions
个钩子,并在其上写一个before_filter :authorize
方法,知道如何对这些期望进行武装,或者为那些坚持手动输入网址的人提供403页面,他们希望将这些内容ApplicationController
公开给他们无法访问的内容。
当我想要配置authorize
时,我会使用Ryan Bates' CanCan gem。
当我想要预定的actions
和Roles
时,我会将Rolify与Nathan Long's Authority结合使用,以获得令人愉快的基于类的{{1}通过授权人类。
Roles
和Permissions
都可以是基于类的,也可以是基于实例的,具体取决于您的用例。例如,您可以使用刚刚发现的Permissions
的能力,确定Roles
在某些基于实例的情况下可能仅作为Permissions
。或者,rolify
的一般Users
可能只能执行操作,因为他们尝试操作的对象属于某种类型。
为了探索这些的排列,假设博客应用程序,遵循公式
{p>Role
Roles
User
User
可以Role
a / an / all / any /那个(class/instance
){{1} }:
action
课程和class/instance
课程:
Permission
Role
Permission
User
任何人Admin
。
delete
类和Post
实例:
Role
Permission
User
人Admin
edit
如果发布的帖子的Posts that they approved to be published
字段指向approved_by
ID,则会更容易。 (对于这种情况,请使用state machine gem。
User
实例和Role
类:
Permission
User
an Author of a Post
comment
Post
<{1}}
请注意,这种情况很少见,这就是为什么我上面没有提到过处理这种情况的宝石,除了管理Rolify
和Authority
等预定情况的能力。结合;或者,如果您必须将此决定传递给您的客户,请使用您自己的自定义解决方案。
Role
实例和Permission
实例:
User
an Author of a Post
edit
Post
Rolify
{/ 1>}
TL; DR:
Users
仅适用于角色:按Permission
分组Permissions
:访问控制器操作。您尚未决定如何管理Rolify
。我希望这有助于您理解{{1}}在身份验证和授权的宏观方案中的地位!