【问题标题】:What is the purpose of Rolify?Rolify的目的是什么?
【发布时间】:2013-04-19 03:32:23
【问题描述】:

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

目前我正在我的控制器中做一些事情,比如如果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。谢谢

【问题讨论】:

  • 我喜欢 reddit 作为问题的来源,但我喜欢 stackoverflow 是答案的权威来源。所以我复制了一个问题,每个人都可能会发现它更容易,更快;和posted my answer on reddit。如果他在 reddit 上认为我的回答不受欢迎,我将在此处链接到任何更好的回答,然后关闭它。否则,我也希望他的问题也能在这里得到解答,然后我会将其传递给 reddit。

标签: ruby-on-rails ruby rolify


【解决方案1】:

我的回答,补充来自this reddit post:的问题

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

授权是确定User 在确定身份后可以执行给定的操作,无论是读取还是写入。

角色只是用户之间的常见授权模式:User 可以被授权这样User 可以被授权授权改为这样

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

Roles 自己不承诺User 可以执行什么操作。请记住——授权是关于行动的。 Roles 概括您正在处理的 User 类型。它们的存在是为了让您不必查询每个User 以获得Permissions 的巨大洗衣清单。他们声明:这个UserRole!他们当然有Permission 来做这件事!

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

    1234563自己的自定义模型,然后在我的ApplicationController 中添加一个before_filter :authorize 钩子,并在其上编写一个authorize 方法,知道如何克服这些期望,或者为那些坚持手动输入网址的人呈现一个403页面他们希望将actions 暴露给他们不应该访问的东西。
  • 当我只想拥有可配置的Roles 时,我使用Ryan Bates' CanCan gem

  • 1234563

RolesPermissions 都可以是基于类或基于实例的,具体取决于您的用例。比如说,您可以利用您刚刚发现的rolify 的能力,决定Users 在某些基于实例的情况下只能充当Role。或者,一般RolesUser 可能只能执行一个action,因为他们尝试action 的对象属于某种类型。

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

一个User谁是一个/一个Roleclass/instance可以action一个/一个/所有/任何/那个(class/instancePermission

  • Role 类和Permission 类:

    作为AdminUser 可以delete 任何Post

  • Role 类和Permission 实例:

    一个User谁是一个Admin可以edit所有Posts that they approved to be published

    如果发布的帖子有一个指向User id 的approved_by 字段,这会更容易。 (在这种情况下使用state machinegem

  • Role 实例和Permission 类:

    an Author of a PostUser 可以在任何Postcomment

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

  • Role 实例和Permission 实例:

    Useran Author of a Postedit 可以是 Post

TL;DR:

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

希望这有助于您了解Rolify身份验证授权的宏伟计划中的地位!

【讨论】:

  • 那么,如果“Rolify 仅适用于角色”,那么使用它有什么意义呢?我使用 Devise + CanCanCan 并在 user.rb def admin? admin end 然后在 ability.rb 中手动定义:if user.admin? can :manage, :all else can :read, :all
  • @prograils 这取决于您要如何编写授权代码(设计主要只是身份验证)。 CanCanCan 是一个权限库,与 Rolify 搭配得很好。您必须问自己user.admin? 方法的来源。起初,这可能只是用户的布尔属性。随着您成长为非二进制角色系统,您最终会在模型上使用大量布尔标志。如果用户也可以拥有多个角色,那么您的检查可能会很快变得复杂。 Rolify 会让它变成 user.has_role? :admin 并干净地处理不断变化的复杂性。
  • @prograils Rolify 还允许对角色进行更细粒度的定义。您可以为特定资源实例的用户添加角色。例如,您希望用户“Joe”具有“项目经理”角色,但仅适用于项目“XYZ”。 link
猜你喜欢
  • 2014-10-23
  • 2011-03-05
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
  • 2019-07-14
  • 2018-11-04
  • 2015-01-17
  • 2021-11-05
相关资源
最近更新 更多