首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rolify的用途是什么?

Rolify的用途是什么?
EN

Stack Overflow用户
提问于 2013-04-19 11:32:23
回答 1查看 5.4K关注 0票数 5

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

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

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

现在,这是我困惑的开始..。在ability.rb内部,我有:

代码语言:javascript
复制
user ||= User.new # guest user (not logged in)
if user.has_role? :consumer
  can :manage, Review
else
  can :read, Review
end

现在假设我向一个用户添加了消费者角色:

代码语言:javascript
复制
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"> 

好的,那么角色就创建好了。我可以通过执行以下操作来检查:

代码语言:javascript
复制
x.has_role? :consumer
=> true

现在,我希望这将为审查提供管理能力……

代码语言:javascript
复制
x.has_role? :consumer, Review
=> true

但不适用于其他型号。在这里我尝试了一些产品

代码语言:javascript
复制
x.has_role? :consumer, Product
=> true

此外,当我查看“资源角色查询”并尝试查询应用的角色以进行审查时,我发现没有应用的角色:

代码语言:javascript
复制
Review.first.applied_roles
=> []

有人能给我解释一下rolify吗。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-19 11:35:07

我的答案,来自this reddit post:的问题

Authentication正在建立一个他们声称的User

授权是指在User建立了自己的身份后,他们可以执行给定的操作,无论是读取还是写入。

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

这里缺少的要素是权限:已建立的Role和一些控制器操作之间的关系。

对于User可以执行的操作,Roles本身并不做任何承诺。记住--授权就是所有的动作。Roles泛化了您正在处理的User类型。它们的存在使您不必向每个User查询一个庞大的Permissions清单。他们声明:这个User是一个Role!当然,他们有Permission可以做到这一点!

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

  • 当我想要拥有可配置的RolesPermissions时,例如,对于您在合同完成时交给某人的客户端应用程序,我使用自己的自定义模型实现一个User :has_many Roles和一个Role :has_many Permissions,然后在我的ApplicationController中添加一个before_filter :authorize钩子,并在其上编写一个知道如何实现这些期望的authorize方法。或者为那些坚持手动输入urls的人呈现403页面,这些人希望将actions暴露给他们不应该访问的内容。
  • 当我只想拥有可配置的Roles时,我使用urls我想要预先确定的RolesPermissions,我将RolifyNathan Long's Authority结合使用,以通过授权程序类获得令人愉快的灵活的基于类的Permissions。<代码>H246<代码>F247

RolesPermissions都可以是基于类的,也可以是基于实例的,这取决于您的用例。您可以,比如说,使用您刚刚发现的rolify的功能,决定Users只能在特定的基于实例的环境中充当Role。或者,User的通用Roles可能只能在给定它们试图操作的对象是特定类型的情况下才能执行操作。

为了探索这些元素的组合,假设有一个博客应用程序,遵循下面的公式

A User is a/an Role class/instance action a/an/all/any/that (class/instance) Permission a/an all/any/that(class/instance)Permission

  • Role类和Permission类:

作为AdminUser可以delete任何Admin类和Permission实例:

作为AdminUser可以edit通所有Posts that they approved to be published

如果发布的帖子有一个指向User id的approved_by字段,这会更容易。(对此类situation.

作为an Author of a PostUser可以在任何Post上使用comment

请注意,这种情况很少见,这就是为什么上面没有我提到的gem来处理这种情况的原因,除了可以同时管理RolifyAuthority等预定情况的能力;或者,如果您必须将此决策传递给您的客户端,则可以使用您自己的自定义solution.

  • Role实例和Permission实例:

an Author of a PostUser可以edit通该命令

TL;DR:

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

我希望这能帮助您理解Rolify在身份验证和授权这一宏大计划中的地位!

票数 38
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16096763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档