Rolify的目的是什么?

时间:2013-04-19 03:32:23

标签: ruby-on-rails ruby 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

现在假设我将使用者角色添加到用户:

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
=> []

有人可以向我解释一下。感谢

1 个答案:

答案 0 :(得分:30)

我的回答,从this reddit post:

中提出问题

身份验证正在确定User他们声称自己是谁。

授权确定User可以在他们确定身份后执行指定的操作,无论是阅读还是写作。

角色只是用户之间授权的常见模式:此User可以授权,即{{1}可以像这样授权而不是

此处缺少的成分是权限:已建立的User与某些控制器操作之间的关系。

Role他们自己对Roles可以执行的操作没有任何承诺。请记住 - 授权就是行动。 User概括了您正在处理的Roles。它们的存在是为了让您不必查询每个User的{​​{1}}巨额清单。他们声明:此UserPermissions!当然他们有User来做到这一点!

Role种类很多。如果您希望足够的授权 Permission能够编辑它们,您可以将它们存储在数据库中,如果您的Permission也应该是可配置的,则可以将它们存储在数据库中。或者,如果您的Users Roles足够静态,您可以使用Ruby代码提前管理User's

  • 当我想要配置RolesPermissions时,即对于您在完成合同时交给某人的客户端应用程序,我实现了Roles和使用我自己的自定义模型Permissions,然后在我的User :has_many Roles中添加Role :has_many Permissions个钩子,并在其上写一个before_filter :authorize方法,知道如何对这些期望进行武装,或者为那些坚持手动输入网址的人提供403页面,他们希望将这些内容ApplicationController公开给他们无法访问的内容。

  • 当我想要配置authorize时,我会使用Ryan Bates' CanCan gem

  • 当我想要预定的actionsRoles时,我会将RolifyNathan Long's Authority结合使用,以获得令人愉快的基于类的{{1}通过授权人类。

RolesPermissions都可以是基于类的,也可以是基于实例的,具体取决于您的用例。例如,您可以使用刚刚发现的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 UserAdmin 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}}

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

  • Role实例和Permission实例:

    User an Author of a Post edit Post Rolify {/ 1>}

TL; DR:

  • Users仅适用于角色:按Permission分组Permissions:访问控制器操作。您尚未决定如何管理Rolify

我希望这有助于您理解{{1}}在身份验证授权的宏观方案中的地位!