我正在开发PHP应用程序,我想为某些对象添加访问控制。我没有将此问题标记为PHP,因为我认为该问题不是特定于语言的。
说我有一个“服务等级”
abstract class Service {
}
许多服务都将此作为基类。一个伪示例为:
class Companies extends Service {
function getCompanyInfo($id) {
//...
}
}
稍后,我想添加访问控制。示例的“ getCompanyInfoById”方法是“读取”操作,因此这将需要“读取”权限。
此时,我可以通过以下方式实现此目的:
将accesscontrol添加到Service类。在完成操作并返回结果之前,每个方法(例如getCompanyInfoById)都必须在内部调用“ hasPrivilege”方法。
将所有Service对象包装在某种Proxy对象中,该对象将在调用内部对象中的方法之前检查特权。
完全独立的访问控制,并在调用方法之前强制“调用方”检查特权。
每个选项的缺点:
这需要更改所有服务,
并要求他们意识到
访问控制。我觉得这很顺利
反对关注分离。
这会破坏OOP功能,例如
多态性。来电者不再
知道任何服务的接口
支持。
这是最灵活的方法,但是最大的缺点是检查权限现在是隐式的。开发人员可以“忘记”或复杂的代码路径可能导致未经授权的服务被调用。
是否有更好的方法可以完全解决此问题?
最佳答案
另一种解决方案可能是您的1。
例如
class Service
{
var $ACL = //some hash map with acl
}
class Companies extends Service
{
function getCompanyById($id)
{
//real code
}
}
class SafeCompanies extends Companies
{
//If a method must be "protected" with an ACL, you must override them in this way
function getCompanyById($id)
{
$this->check('read'); //raise an exception if current user haven't READ privilege
parent::getCompanyById($id);
}
}
这样,您就不会混合职责,仍然可以使用多态
我的2美分
关于design-patterns - 访问控制设计模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1921035/