5

嗨,我正在使用 rolify 并且刚刚意识到我实际上并没有充分利用它的全部潜力。

目前我正在我的控制器中做一些事情,比如重新路由用户 if current_user.has_role? :whatever_role,并允许用户如果他们有任何其他角色......

有人在 stackoverflow 上问了一个关于 rolify 的问题,当我试图回答时,我意识到我做错了。

现在,这就是我的困惑开始的地方......在 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
=> []

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

4

1 回答 1

38

我的回答,从这个 reddit 帖子中装饰了这个问题:

身份验证正在建立User他们声称的身份。

授权是建立一个User可以执行给定动作,无论是阅读还是写作,在他们建立了他们的身份之后。

角色只是跨用户的常见授权User模式:可以这样授权User可以这样授权

您在这里缺少的成分是PermissionsRole :已建立的操作和某些控制器操作之间的关系。

RolesUser他们自己不承诺 a可以执行什么操作。请记住——授权就是关于行动的。Roles概括User你正在处理的类型。它们的存在是为了让您不必查询User每个Permissions. 他们宣称:这User是一个Role!他们当然必须Permission这样做!

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

  • 当我想要配置RolesandPermissions时,即对于您在合同完成时移交给某人的客户端应用程序,我使用自己的自定义模型实现 aUser :has_many Roles和 a Role :has_many Permissions,然后在before_filter :authorize我的 中添加一个钩子ApplicationController,并在其上编写一个authorize方法知道如何克服这些期望,或者为那些坚持手动输入他们希望暴露actions给他们不应该访问的东西的东西的 URL 的人呈现 403 页面。

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

  • 当我想要预先确定RolesandPermissions时,我将RolifyNathan Long 的 AuthorityPermissions结合使用,通过 Authorizer 类获得非常灵活的基于类。

两者都Roles可以Permissions是基于类的或基于实例的,具体取决于您的用例。比如说,你可以用rolify你刚刚发现的能力,决定它Users只能Role在某些基于实例的情况下发挥作用。或者,考虑到他们试图采取行动Roles的对象是某种类型,他们User可能只能执行一个行动。

为了探索这些排列,假设一个博客应用程序,遵循公式

a Userwho is a/an Role class/instancecan actiona/an/all/any/that ( class/instance) Permission:

  • Role班级和Permission班级:

    A Userwho is an Admincan deleteany Post

  • Role类和Permission实例:

    A Userwho is an Admincan editallPosts that they approved to be published

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

  • Role实例和Permission类:

    一个Useran Author of a Post可以comment在任何Post

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

  • Role实例和Permission实例:

    一个能做到的User人。an Author of a PosteditPost

TL;博士:

  • Rolify仅适用于角色:分组Users依据Permission:访问控制器操作。你还没有决定你将如何管理Permissions

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

于 2013-04-19T03:35:07.260 回答