Chr*_*ele 5 ruby ruby-on-rails rolify
嗨,我正在使用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
Run Code Online (Sandbox Code Playgroud)
现在让我们说我将用户角色添加到用户:
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">
Run Code Online (Sandbox Code Playgroud)
是的,所以创建了角色.我可以通过这样做来检查:
x.has_role? :consumer
=> true
Run Code Online (Sandbox Code Playgroud)
现在我希望这能为评论提供管理能力......
x.has_role? :consumer, Review
=> true
Run Code Online (Sandbox Code Playgroud)
但不适用于其他型号......我在这里尝试产品
x.has_role? :consumer, Product
=> true
Run Code Online (Sandbox Code Playgroud)
此外,当我查看"资源角色查询"并尝试查询应用的评论角色时,我发现没有应用角色:
Review.first.applied_roles
=> []
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释rolify.谢谢
Chr*_*ele 32
我的回答,从这篇reddit帖子中补充问题:
身份验证正在建立一个User他们声称是谁.
授权正在确定a User能够在他们建立自己的身份后执行特定的操作,无论是阅读还是写作.
角色是只是普通模式授权跨用户:这User可以被授权为这样,即User可以被授权这样代替.
你在这里缺少的成分是Permissions:已建立的Role和一些控制器动作之间的关系.
Roles他们自己不承诺User可以采取什么行动.请记住 - 授权就是行动.Roles概括User你正在处理什么样的事情.它们的存在是为了让您不必查询每个User巨大的洗衣清单Permissions.他们宣称:这User是一个Role!当然他们必须Permission这样做!
有很多种类型Permission.如果您希望有足够的授权 Users能够编辑它们,您可以将它们存储在数据库中,Roles如果这些也应该是可配置的.或者,如果您User's Roles的静态足够,可以Permissions使用Ruby代码提前管理:
当我想有配置Roles和Permissions,即对于你在完成合同移交给别人一个客户端应用程序,我实现一个User :has_many Roles和Role :has_many Permissions我自己的自定义模型,然后添加一个before_filter :authorize勾到我ApplicationController,写的authorize方法就可以了知道如何武装这些期望,或者为那些坚持手动输入网址的人提供403页,他们希望actions这些东西能够暴露给他们无法访问的东西.
当我想要配置时Roles,我使用Ryan Bates的CanCan gem.
当我想已经预定Roles和Permissions,我用Rolify会同森龙的权威,获得基于类兴高采烈灵活的Permissions通过认证器类.
两者都可以是基于类的Roles,Permissions也可以是基于实例的,具体取决于您的用例.你可以说,rolify你刚刚发现的能力,决定Users只能作为Role某种基于实例的情况.或者,一般情况下Roles,User只有在他们尝试操作的对象属于某种类型时才能执行操作.
为了探索这些的排列,假设一个博客应用程序,遵循公式
一个User谁是/一个Role class/instance可以action一/一个/所有/任何/是(class/instance)Permission:
Role班级和Permission班级:
一个User谁是Admin可以delete任意Post.
Role类和Permission实例:
一个User谁是Admin可以edit全Posts that they approved to be published
Role实例和Permission类:
一个User是谁an Author of a Post可以comment在任何Post
请注意,这种情况很少见,这就是为什么有我上面提到的处理这种情况,除了可能管理等预先确定的环境的能力没有宝石Rolify和Authority配合; 或者,如果您必须将此决定传递给您的客户,请使用您自己的自定义解决方案.
Role实例和Permission实例:
一个User是谁an Author of a Post可以edit说Post.
TL; DR:
Rolify仅仅是角色:分组Users通过Permission访问控制器的作用.您还没有决定如何管理Permissions.我希望这有助于您理解Rolify在宏观认证和授权方案中的地位!
| 归档时间: |
|
| 查看次数: |
4618 次 |
| 最近记录: |