Rolify的目的是什么?

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代码提前管理:

  • 当我想有配置RolesPermissions,即对于你在完成合同移交给别人一个客户端应用程序,我实现一个User :has_many RolesRole :has_many Permissions我自己的自定义模型,然后添加一个before_filter :authorize勾到我ApplicationController,写的authorize方法就可以了知道如何武装这些期望,或者为那些坚持手动输入网址的人提供403页,他们希望actions这些东西能够暴露给他们无法访问的东西.

  • 当我想要配置时Roles,我使用Ryan Bates的CanCan gem.

  • 当我想已经预定RolesPermissions,我用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可以editPosts that they approved to be published

    如果发布的帖子有一个approved_by指向Userid 的字段,这将更容易.(在这种情况下使用状态机 gem.

  • Role实例和Permission类:

    一个User是谁an Author of a Post可以comment在任何Post

    请注意,这种情况很少见,这就是为什么有我上面提到的处理这种情况,除了可能管理等预先确定的环境的能力没有宝石RolifyAuthority配合; 或者,如果您必须将此决定传递给您的客户,请使用您自己的自定义解决方案.

  • Role实例和Permission实例:

    一个User是谁an Author of a Post可以editPost.

TL; DR:

  • Rolify仅仅是角色:分组Users通过Permission访问控制器的作用.您还没有决定如何管理Permissions.

我希望这有助于您理解Rolify在宏观认证授权方案中的地位!

  • @prograils这取决于您要如何编写授权代码(Devise主要只是身份验证)。CanCanCan是一个权限库,可与Rolify很好地配对。您必须问自己“ user.admin?”方法的来源。首先,这可能只是用户的布尔属性。当您成长为非二进制角色系统时,最终会在模型上产生大量布尔标志。如果用户也可以担任多个角色,则检查会很快变得复杂。Rolify会让那个变成`user.has_role?:admin`并干净地处理不断变化的复杂性。 (2认同)
  • @prograils Rolify 还允许对角色进行更细粒度的定义。您可以为特定资源实例的用户添加角色。例如,您希望用户“Joe”具有“项目经理”角色,但仅限于项目“XYZ”。[链接](https://github.com/RolifyCommunity/rolify#6-resource-roles-querying) (2认同)