我想听听你对我面前的任务的看法。此外,如果有任何已知的设计模式,分享会做很多。
任务是创建项目的体系结构。
会有几种类型的用户:
当他们打开网页时,我需要返回用户有权访问的每个模块(页面)。
我在考虑多态性。我将有一个基本用户,它具有作为受保护属性的权限和每个新类,例如。主管,将添加更多或覆盖基础。
每个模块都有组件(网页的一部分),get的结果将是这样的
$modulesAccess = [
'baseModel' => array(
'componentOne',
'componentTwo',
),
]
有了这个,前端开发人员就会知道究竟要绘制什么。
我正在考虑在数据库中创建这些模型/组件,但通过代码管理它们会更容易。而且多态在我们那里做得足够好。
棘手的部分,自定义用户。这个想法是每个Model / Component都会有一个不同的ajax请求来返回特定的数据。每个上层用户都必须以不同方式实现它。这很好,但是自定义用户,比方说是一个主管,他需要只能从管理员访问一个模型/组件。
你会如何处理?
提前谢谢。
答案 0 :(得分:9)
经验方法是在以下主要模型中构建身份验证和授权:
这可以满足您的大多数安全方案。例如:
另外你可以:
多态性不适合用于形成用户类型。而是使用组或角色。
答案 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返回。