多级授权,不仅基于角色

Lui*_*mim 13 acl authorization

我们的应用程序使用多种方式来授权访问给定资源.虽然它有效,但它很混乱......好吧,它似乎不对.

1)基于角色的授权

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

截至目前,资源只是在数据库表中映射的MVC动作module,controlleraction.

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

2)基于用户的授权

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

RoleA:资源一个,b,c ^,d
RoleB:资源X,ÿ,ž
ROLEC:资源1,2,3
用户1:具有RoleA但需要访问资源ÿ
用户2:具有RoleBROLEC但不具有访问资源ž

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

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

3)模型状态授权

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

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

4)在UI中显示信息

角色,角色组或个人用户可以根据其状态查看有关模型的更多或更少信息.

如何在不放弃授予或限制资源访问权限的情况下简化此授权过程?

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

Lui*_*mim 11

很长一段时间后,我终于找到了满足我所有要求的答案:http: //lostechies.com/derickbailey/2011/05/24/dont-do-role-based-authorization-checks-do-activity-based-checks /.

他的解决方案是将所有内容都视为一项活动,执行/调用的权限/为角色提供的任何活动以及用户可以拥有多个角色.

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


koe*_*oen 10

我已经使用规范模式实现了访问控制,我发现它直接适用于此.一个核心方法是isSatisfiedBy.如果z满足,则允许X执行y.例如,如果"具有管理员角色"满足,则允许用户查看"管理页面".看看如何isSatisfiedBy非常通用(例如'是id为324的用户,'已经登录30分钟','是foo组的成员',......).然后规则变成以下一般形式:

allow X to do Y if X satisfies Z
Run Code Online (Sandbox Code Playgroud)