【发布时间】:2012-04-11 07:09:13
【问题描述】:
我们的应用程序使用多种方式来授权对给定资源的访问。虽然它可以工作,但它很乱,而且......好吧,它似乎不正确。
1) 基于角色的授权
我们有明确定义的角色,其中每个角色都可以访问一组资源,而不同的角色可以访问相同的资源。
到目前为止,资源只是在数据库表中映射为 module、controller 和 action 的 MVC 操作。
这似乎没问题,但每次我需要添加新的控制器/操作时,我都必须将此资源映射到数据库表。
2) 基于用户的授权
除了基于角色的授权之外,用户可以或多或少地访问另一个角色的资源子集。 例如:
RoleA:资源a、b、c、d
RoleB:资源x、y、z
RoleC:资源1、2、3
User1:具有RoleA,但需要访问资源 y
User2:具有 RoleB 和 RoleC 但无权访问资源 z
这是作为user_resources 表实现的,其中包含用户有权访问或被拒绝(由标志指示)的其他资源的条目。
我可以创建具有定制访问权限的不同角色,将角色视为一组权限,但这会导致角色爆炸。
3) 模型状态授权
如果这还不够,一些动作只能在模型处于某种状态时才能执行(每个模型都知道什么时候可以做某事)。 例如:只有当用户有权访问 edit 资源(通过步骤 #1 或 #2)并且可以编辑对象 Order 时,才能编辑订单.
另一个示例:如果用户有权访问 /customer/view 资源并且他拥有该客户(他是该客户的联系信息),则他可以访问 Customer客户)。
4) 在 UI 中显示信息
一个角色、一组角色或单个用户可以看到更多或更少关于模型的信息,具体取决于模型的状态。
如何在不失去授予或限制对资源访问的灵活性的情况下简化此授权流程?
我在这里缺少什么模式来将所有这些授权统一在一个地方?
【问题讨论】:
标签: authorization acl