我正在开发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/

10-09 13:13