Rolify的目的是什么?
嗨,我正在使用rolify,并且刚刚意识到我并没有真正利用它的全部潜力。
目前我正在我的控制器中做一些事情,如重新路由用户如果current_user.has_role? :whatever_role
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 # => #
是的,所以创建了角色。 我可以通过这样做来检查:
x.has_role? :consumer => true
现在我希望这能为评论提供管理能力……
x.has_role? :consumer, Review => true
但不适用于其他型号……我在这里尝试产品
x.has_role? :consumer, Product => true
此外,当我查看“资源角色查询”并尝试查询应用的评论角色时,我发现没有应用角色:
Review.first.applied_roles => []
有人可以向我解释rolify。 谢谢
我的回答,从这个redditpost中补充问题:
身份validation正在建立User
是他们声称的身份。
授权确定User
在建立自己的身份后可以执行特定的操作,无论是阅读还是写作。
角色只是跨用户的常见授权模式:此User
可以这样授权,即可以像这样授权User
。
您在此处缺少的成分是权限 :已建立的Role
与某些控制器操作之间的关系。
Roles
本身不会对User
可以执行的操作做出任何承诺。 请记住 – 授权就是行动。 Roles
概括了您正在处理的User
类型。 它们的存在是为了让您不必向每个User
查询一个巨大的Permissions
清单。 他们声明:这个User
是一个Role
! 当然他们有权做到这一点!
有许多类型的Permission
。 如果您希望足够授权的 Users
能够编辑它们,您可以将它们存储在数据库中,如果这些Roles
也应该是可配置的,则可以将它们与Roles
一起存储。 或者,如果您的User's
Roles
足够静态,您可以使用Ruby代码提前管理Permissions
:
-
当我想要具有可配置的
Roles
和Permissions
,即对于在完成合同时交给某人的客户端应用程序,我实现了一个User :has_many Roles
和Role :has_many Permissions
与我自己的自定义模型,然后添加一个before_filter :authorize
挂钩到我的ApplicationController
,并在其上编写一个知道如何武装这些期望的authorize
方法,或者为那些坚持手动输入url的人提供403页面,他们希望将这些actions
暴露给他们不应该拥有的东西进入。 -
当我想拥有可配置的
Roles
,我会使用Ryan Bates的CanCan gem 。 -
当我想要预定的
Roles
和Permissions
,我将使用Rolify与Nathan Long的权限一起使用,通过授权者类获得令人愉快的基于类的Permissions
。
Roles
和Permissions
都可以基于类或基于实例,具体取决于您的用例。 例如,您可以使用刚刚发现的rolify
的能力,确定Users
可能仅在某些基于实例的情况下充当Role
。 或者, User
一般Roles
可能只能在他们尝试操作的对象属于某种类型的情况下执行操作。
为了探索这些的排列,假设一个博客应用程序,遵循公式
作为Role
class/instance
用户可以action
a / an / all / any / that( class/instance
) Permission
:
-
Role
类和Permission
类:作为
Admin
User
可以delete
任何Post
。 -
Role
类和Permission
实例:作为
Admin
User
可以edit
Posts that they approved to be published
所有Posts that they approved to be published
如果发布的post有一个指向
User
ID的approved_by
字段,这将更容易。 (在这种情况下使用状态机 gem 。 -
Role
实例和Permission
类:an Author of a Post
User
可以对任何Post
comment
请注意,这种情况很少见,这就是为什么我上面没有提到过处理这种情况的gem,除了可能管理像
Rolify
和Authority
这样的预定情况的能力; 或者,如果您必须将此决定传递给您的客户,请使用您自己的自定义解决方案。 -
Role
实例和Permission
实例:an Author of a Post
User
可以edit
该Post
。
TL; DR:
-
Rolify
仅适用于角色:按Permission
对Users
进行分组:访问控制器操作。 您还没有决定如何管理Permissions
。
我希望这有助于您理解Rolify
在宏观认证和授权方案中的地位!