繁体   English   中英

Rolify的目的是什么?

[英]What is the purpose of Rolify?

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

目前我在我的控制器中做的事情就像重新路由用户一样,如果current_user.has_role? :whatever_role 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
=> []

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

我的回答,从这篇reddit帖子中补充问题

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

授权确定User在建立身份后可以执行特定操作,无论是阅读还是写作。

角色跨用户的授权的只是常见的模式:此User可以被授权为这样的 ,即User可以被授权这样吧

你在这里缺少的成分是权限 :既定Role和某些控制器动作之间的关系。

Roles本身不会对User可以执行的操作做出任何承诺。 请记住 - 授权就是行动。 Roles概括了您正在处理的User类型。 它们的存在是为了让您不必向每个User查询一个巨大的Permissions清单。 他们声明:这个User是一个Role 当然他们有Permission这样做!

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

  • 当我想拥有可配置的RolesPermissions ,即对于在完成合同时交给某人的客户端应用程序,我实现了一个User :has_many RolesRole :has_many Permissions与我自己的自定义模型,然后添加一个before_filter :authorize钩到我ApplicationController ,并写authorize方法就可以了,它知道如何门派这些期望,或呈现一个403页对于那些谁坚持要手动输入网址的东西,他们希望暴露人actions的东西,他们不该有进入。

  • 当我想拥有可配置的Roles ,我会使用Ryan Bates的CanCan gem

  • 当我想要预定的RolesPermissions ,我使用RolifyNathan Long的权限一起使用,通过授权者类获得令人愉快的基于类的Permissions

RolesPermissions都可以基于类或基于实例,具体取决于您的用例。 例如,您可以使用刚刚发现的rolify的功能,确定Users可能仅在某些基于实例的情况下充当Role 或者,一般RolesUser可能只能够执行给定的,他们正试图采取行动是某种类型的对象中的动作

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

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

  • Role类和Permission类:

    作为Admin User可以delete任何Post

  • Role类和Permission实例:

    作为Admin User可以edit Posts that they approved to be published所有Posts that they approved to be published

    如果发布的帖子具有指向User ID的approved_by字段,则这将更容易。 (在这种情况下使用状态机 gem

  • Role实例和Permission类:

    an Author of a Post User可以对任何Post comment

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

  • Role实例和Permission实例:

    an Author of a Post User可以editPost

TL; DR:

  • Rolify仅适用于角色:按PermissionUsers进行分组:访问控制器操作。 您还没有决定如何管理Permissions

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM