如何正确管理 PHP 上的用户权限?

How do I properly manage user permission on PHP?

我已经阅读了有关 ACL (访问控制列表) 的内容,但我不明白使用它比使用 [=15= 有什么意义]金字塔的思维方式。 (Controller Admin 扩展了 Moderator,后者扩展了 User)。

最好的方法是什么?堆叠扩展是一种不好的做法吗?

首先,身份验证。

这只是登录并断言 username / password 组合与用户 X 相关。

二、授权。

第二个通常是事情会变得更复杂的地方。但对于大多数用例,您的一般理解就可以了。

Zend\Rbac or Zend\Acl 这样的包是在域逻辑中实现授权的良好起点。我更喜欢 RBAC,因为它涉及更多的实现。阅读它以获得更细微的方法。

使用 rbac,用户有一个角色 (admin),它可以继承自版主,也可以继承自用户。在 rbac 中,角色被授权做某事,而不是身份(user / principal 在其他语言中)。当您授权编辑评论时,事情会变得棘手。只有所有者可以编辑自己的评论 (per-entity rules)。但版主可以编辑或删除任何人的评论。

在上面的包中,我为每个实体的授权使用了自定义编写的断言,因为这是在该包中处理该问题的一种非常简单的方法。或者你可以有一个用户是客户 X 的管理员......但这并不意味着他们是客户 Y 的管理员。所以你的规则可以不仅仅是一个简单的层次结构。

在这些情况下,每个用户可能与客户以及每个用户的相关角色具有多对多关系

您的 isAllowed 方法必须根据业务标准进行检查。这特定于您的领域——这就是为什么授权策略因项目而异的原因。通常,当事情变得复杂时,就会发生这种情况。否则,大多数时候权限真的不会太复杂而无法弄清楚。

如果对象属于彼此并且具有父对象 'value',则堆叠扩展从来都不是真正的问题。因此,Admin -> Moderator -> User -> Anonymous -> UserBase 适合授权分层。

但是正如 Giulio 已经提到的那样,这个的实现在多个项目中是广泛而广泛的不同,一个人可以使用包或推出他们自己的包(如果他们知道他们在做什么,否则使用预先存在的包会更安全像上面提到的那些)