我正在开发一个 PHP 应用程序,我想为我的一些对象添加访问控制。我没有将这个问题标记为 PHP,因为我觉得这个问题不是特定于语言的。
假设我有一个“服务类”
abstract class Service {
}
许多服务使用它作为基类。一个伪示例是:
class Companies extends Service {
function getCompanyInfo($id) {
//...
}
}
后来我想添加访问控制。示例“getCompanyInfoById”方法是“读取”操作,因此需要“读取”权限。
此时我可以通过以下方式实现它:
- 将访问控制添加到服务类。每个方法(例如 getCompanyInfoById)都必须在内部调用“hasPrivilege”方法,然后才能完成操作并返回结果。
- 将所有服务对象包装在某种代理对象中,该对象将在调用内部对象中的方法之前检查权限。
- 完全分离访问控制,并强制“调用者”在调用方法之前检查权限。
每个选项的缺点:
- 这需要更改所有服务,并要求它们了解访问控制。我觉得这违背了关注点的分离。
- 这破坏了 OOP 特性,例如多态性。调用者不再知道任何服务支持哪些接口。
- 这是最灵活的,但最大的缺点是检查权限现在是隐式的。开发人员可能会“忘记”或复杂的代码路径会导致调用未经授权的服务。
有没有更好的方法来解决这个问题?