gpt4 book ai didi

design-patterns - 访问控制设计模式

转载 作者:行者123 更新时间:2023-12-04 18:53:56 24 4
gpt4 key购买 nike

我正在开发一个 PHP 应用程序,我想为我的一些对象添加访问控制。我没有将这个问题标记为 PHP,因为我觉得这个问题不是特定于语言的。

假设我有一个“服务类”

abstract class Service {


}

许多服务使用它作为基类。一个伪示例是:
class Companies extends Service {

function getCompanyInfo($id) {
//...
}

}

后来我想添加访问控制。示例“getCompanyInfoById”方法是“读取”操作,因此需要“读取”权限。

此时我可以通过以下方式实现它:
  • 将访问控制添加到服务类。每个方法(例如 getCompanyInfoById)都必须在内部调用“hasPrivilege”方法,然后才能完成操作并返回结果。
  • 将所有服务对象包装在某种代理对象中,该对象将在调用内部对象中的方法之前检查权限。
  • 完全分离访问控制,并强制“调用者”在调用方法之前检查权限。

  • 每个选项的缺点:
  • 这需要更改所有服务,
    并要求他们意识到
    访问控制。我觉得这行
    反对关注点分离。
  • 这会破坏 OOP 功能,例如
    多态性。来电者不再
    知道任何服务的接口(interface)
    支持。
  • 这是最灵活的,但最大的缺点是检查权限现在是隐式的。开发人员可能会“忘记”或复杂的代码路径会导致调用未经授权的服务。

  • 有没有更好的方法来解决这个问题?

    最佳答案

    另一个解决方案可能是您的 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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com