选择架构

时间:2016-06-07 11:39:00

标签: php design-patterns

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

任务是创建项目的体系结构。

会有几种类型的用户:

  • 普通用户
  • 管理员
  • custom(这是一个棘手的部分)

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

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

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

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

有了这个,前端开发人员就会知道究竟要绘制什么。

我正在考虑在数据库中创建这些模型/组件,但通过代码管理它们会更容易。而且多态在我们那里做得足够好。

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

你会如何处理?

提前谢谢。

4 个答案:

答案 0 :(得分:9)

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

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

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

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

另外你可以:

  • 在组中添加/删除特定用户。
  • 以及......

多态性不适合用于形成用户类型。而是使用组或角色。

答案 1 :(得分:3)

使用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();

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

关于解决对Controller / Model的AJAX调用的问题。我会让控制器处理AJAX调用,并根据访问权限调用模型并返回响应。通过AJAX调用模型只是绕过了应该避免使用的控制器。

答案 2 :(得分:1)

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

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

所以,假设您有3个页面,一个仅供管理员使用,一个适用于主管,一个适用于每个页面,

以这种方式定义角色树

ROLE_ADMIN
   |- ROLE_SUPERVISOR
      |-ROLE_USER

然后......为用户设置角色...

最好的部分是灵活性,你可以让你的树像你想要的那样颗粒化,甚至可以通过许多顺便生成海关角色......

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

这是symfony框架的一部分,该库还有许多其他功能,你可以找到它们,例如选民。

答案 3 :(得分:1)

查看Proxy Pattern Design Pattern by GoF

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

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

查看Proxy in PHP