【问题标题】:Multiple levels of authorization, not only role-based多级授权,不仅基于角色
【发布时间】:2012-04-11 07:09:13
【问题描述】:

我们的应用程序使用多种方式来授权对给定资源的访问。虽然它可以工作,但它很乱,而且......好吧,它似乎不正确。

1) 基于角色的授权

我们有明确定义的角色,其中每个角色都可以访问一组资源,而不同的角色可以访问相同的资源。

到目前为止,资源只是在数据库表中映射为 modulecontrolleraction 的 MVC 操作。

这似乎没问题,但每次我需要添加新的控制器/操作时,我都必须将此资源映射到数据库表。

2) 基于用户的授权

除了基于角色的授权之外,用户可以或多或少地访问另一个角​​色的资源子集。 例如:

RoleA:资源abcd
RoleB:资源xyz
RoleC:资源123
User1:具有RoleA,但需要访问资源 y
User2:具有 RoleBRoleC 但无权访问资源 z

这是作为user_resources 表实现的,其中包含用户有权访问或被拒绝(由标志指示)的其他资源的条目。

我可以创建具有定制访问权限的不同角色,将角色视为一组权限,但这会导致角色爆炸。

3) 模型状态授权

如果这还不够,一些动作只能在模型处于某种状态时才能执行(每个模型都知道什么时候可以做某事)。 例如:只有当用户有权访问 edit 资源(通过步骤 #1 或 #2)并且可以编辑对象 Order 时,才能编辑订单.

另一个示例:如果用户有权访问 /customer/view 资源并且他拥有该客户(他是该客户的联系信息),则他可以访问 Customer客户)。

4) 在 UI 中显示信息

一个角色、一组角色或单个用户可以看到更多或更少关于模型的信息,具体取决于模型的状态。

如何在不失去授予或限制对资源访问的灵活性的情况下简化此授权流程?

我在这里缺少什么模式来将所有这些授权统一在一个地方?

【问题讨论】:

    标签: authorization acl


    【解决方案1】:

    我已经使用specification pattern 实现了访问控制,我发现它直接适合这个。一个中心方法是isSatisfiedBy。如果 z 满足 X,则允许 X 做 y。例如,如果用户对“具有管理员角色”感到满意,则允许用户查看“管理页面”。看看isSatisfiedBy 是如何非常通用的(例如,'是 id 为 324 的用户'、'已登录 30 分钟'、'是组 foo 的成员',...)。然后规则变成以下一般形式:

    allow X to do Y if X satisfies Z
    

    【讨论】:

      【解决方案2】:

      折腾了半天,终于找到了一个满足我所有要求的答案: http://lostechies.com/derickbailey/2011/05/24/dont-do-role-based-authorization-checks-do-activity-based-checks/.

      他的解决方案是将一切都视为一个活动,执行/调用/任何活动的权限被赋予一个角色,并且用户可以拥有多个角色。

      这种方法的亮点在于权限检查是针对活动本身进行的,而不是针对角色。

      【讨论】:

      • 这种方法不处理你提到的“模型状态授权”。您如何处理您提到的案例 - 如果用户有权访问“VIEW_CUSTOMER 并拥有该客户?”,则用户可以看到该客户?
      • 我使用规范模式实现了授权服务。例如,CancelOrder 活动有 2 个规范:CloseOrderSpecification(用于基本授权检查)和CloseOwnOrdersSpecification 用于模型状态授权。如果满足这 2 个规范,则用户可以访问该活动。
      • 我最喜欢这篇博文的地方在于能够真正分离关注点——例如如果您使用活动标签 SOME_ACTIVITY 注释您的方法,则可以在其他地方分隔检查。在您使用规范模式的方法中,您在哪里编写规范?您是否对活动主体(简单,但在更改时需要重新编码)或其他地方(更干净,但可能更难访问所需的所有模型对象)执行检查?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 2017-12-14
      • 2017-04-12
      • 2018-07-21
      • 1970-01-01
      相关资源
      最近更新 更多