【问题标题】:Choosing architecture [closed]选择架构[关闭]
【发布时间】:2016-10-07 07:07:14
【问题描述】:

我想听听您对我面前的任务的看法。此外,如果有任何已知的设计模式,分享会做很多事情。

任务是创建项目的架构。

会有几种类型的用户:

  • 普通用户
  • 主管
  • 管理员
  • 自定义(这是棘手的部分)

当他们打开网页时,我需要返回用户可以访问的每个模块(页面)。

我在考虑多态性。例如,我将有一个基础用户,该用户具有受保护属性和每个新类的权限。主管,将添加更多或覆盖基本的。

每个模块都有组件(网页的一部分),获取的结果会是这样的

$modulesAccess = [
     'baseModel' => array(
         'componentOne',
         'componentTwo',
     ),
]

这样,前端开发人员将知道要绘制的确切内容。

我想在数据库中制作这些模型/组件,但通过代码管理它们会更容易。多态性对我们来说已经足够好。

棘手的部分,自定义用户。这个想法是每个模型/组件都会有一个不同的 ajax 请求来返回特定的数据。每个上层用户都必须以不同的方式实现它。这很好,但是自定义用户,例如,一个主管,他只需要从管理员那里访问一个模型/组件。

你会怎么处理?

提前谢谢你。

【问题讨论】:

  • 我认为在数据库级别使用Role-Based Access Control 更容易。
  • 您可以使用访问控制列表和链接管理器类来根据可用页面构建用户角色。可以使用链接管理器构建任何新的自定义用户。在链接管理器中,您可以创建包含用户可以根据其角色从中选择的链接的类别。在这种情况下,您可以使用订单 ID,其中具有较低级别访问权限的用户无法选择具有较高订单 ID 的权限。

标签: php design-patterns


【解决方案1】:

一种经验方法是在以下主要模型中构建身份验证和授权:

  • 用户:代表一个用户。
  • Group/Role:代表一组用户。在某些情况下是用户的角色。
  • Module:代表你的模块,只是封装了它的定义信息。
  • Permission:表示一个权限和一个"CRUD"操作(创建、读取、更新、删除)

这可以满足您的大多数安全场景。例如:

  • 获取特定用户具有“查看”权限的所有模块。
  • 获取主管拥有“查看”权限的所有模块。

此外,您还可以:

  • 在组中添加/删除特定用户。
  • 还有更多...

多态性不适合用于形成用户类型。相反,使用组或角色。

【讨论】:

  • 并为自定义规则创建单用户组
【解决方案2】:

使用decorator pattern,当您添加新功能时,您的代码不需要扩展原始类,因为它允许在具有独特关注领域的类之间划分功能。

class AuthProvider
{

    protected $target = null;
    protected $acl = null;

    public function __construct( $target, $acl )
    {
        $this->target = $target;
        $this->acl = $acl;
    }

    public function __call( $method, $arguments )
    {
        if ( 
             method_exists( $this->target, $method )
          && $this->acl->isAllowed( get_class($this->target), $method )
        ){
            return call_user_func_array( 
                array( $this->target, $method ),
                $arguments
            );
        }
    }

}

然后这样称呼它

// Based on your: $current_User and $controller 
$acl = new AccessControlList( $current_User );

$controller = new AuthProvider( $controller, $acl );
// you can execute all the methods you had in previous controller 
// only now they will be checked against ACL
$controller->actionIndex();

访问方法时,根据访问权限检查是否允许执行。

就您处理对控制器/模型的 AJAX 调用的问题而言。我会让控制器处理 AJAX 调用,并根据访问权限调用模型并返回响应。通过 AJAX 调用模型只是绕过了应该避免的控制器。

【讨论】:

    【解决方案3】:

    尽量不要重新发明轮子,寻找已经为您解决问题的框架或库,您的问题很简单并且已经解决...

    您基本上需要 2 个类,一个用户和一个角色,角色可以按树分组。

    所以,假设您有 3 个页面,一个用于管理员,一个用于主管,一个用于每个人,

    你用这种方式定义你的角色树

    ROLE_ADMIN
       |- ROLE_SUPERVISOR
          |-ROLE_USER
    

    然后...为您的用户分配角色...

    最好的部分是它的灵活性,您可以根据需要使您的树变得尽可能精细,甚至可以生成具有许多赞许的自定义角色...

    实现此模型的库是:http://symfony.com/doc/current/components/security/index.html

    wich 是 symfony 框架的一部分,该库还有许多其他有用的功能,例如选民。

    【讨论】:

      【解决方案4】:

      看看Proxy Pattern,它是Design Pattern by GoF

      代理模式是为访问控制而设计的。

      当客户端发出请求时,它会通过代理转发,其中包含您的权限检查和访问控制。如果请求有效,则 RealSubject 通过 Proxy 返回结果。

      查看Proxy in PHP

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-30
        • 1970-01-01
        • 2010-10-13
        • 2010-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多