我已经阅读了关于ACL (访问控制列表)的信息,但我不知道使用它的重点是什么 pyramidal 思维方式。 (Controller Admin扩展了扩展User的Moderator。)
最好的方法是什么?堆栈扩展是一种不好的做法吗?
答案 0 :(得分:3)
仅登录并断言username / password
组合与用户X相关。
第二种情况通常是事情变得更加复杂。但对于大多数用例,您的一般理解都很好。
Zend\Rbac或Zend\Acl等软件包是在您的域逻辑中实施授权的良好起点。我更喜欢RBAC,因为它涉及更多的实现。阅读更多细微差别的方法。
使用rbac,用户有一个角色(admin
)可以继承自版主,也可以从用户继承。在rbac中,角色被授权做某事,而不是身份(user / principal
在其他语言中)。当您授权编辑评论时,事情会变得棘手。只有所有者才能编辑自己的评论(per-entity rules
)。但主持人可以编辑或删除任何人的评论。
在上面的包中,我使用自定义编写的断言来实现每个实体的授权,因为这是在该包中处理它的一种非常简单的方法。或者你可以让一个用户是客户X的管理员...但这并不意味着他们是客户Y的管理员。因此,除了简单的层次结构之外,你的规则可以非常复杂。
在这些情况下,每个用户可能与客户建立多对多关系,并为每个用户提供相关角色。
您的isAllowed
方法必须根据业务标准进行检查。这是您的域特有的 - 这就是为什么授权策略在不同项目之间变化很大的原因。通常,当事情变得复杂时就会发生。否则,大多数时候权限实在太复杂了。
答案 1 :(得分:1)
如果对象彼此属于并且具有父级“值”,则堆叠扩展永远不会成为问题。所以管理员 - >主持人 - >用户 - >匿名 - > UserBase适用于授权分层。
但正如Giulio已经提到的那样,这个实现在多个项目中广泛且大致不同,人们可以使用包或自己推送(如果他们知道他们在做什么,否则它更安全,去寻找预先存在的包,如上面提到的那些)