Zend framework2 一个好的访问控制模式

Zend framework2 一个好的访问控制模式,zend-framework2,aop,acl,rbac,Zend Framework2,Aop,Acl,Rbac,我一直在开发Zend Framework 2应用程序。它有一个包裹模型层的服务层。控制器调用服务层,服务层与模型和映射器对话 我发现的问题是,访问控制需要很多努力,包括测试。该应用程序使用社交图,因此访问规则相当复杂。例如,如果用户A想要访问关于用户B的特定类别的信息,他们可能需要是某种类型的用户,并且可能需要到B的一定数量的连接 一些访问规则似乎属于模型层。要将它们放在服务层,我必须将模型功能泄漏到服务中。另一些似乎属于服务层,例如,从映射器中提取对象集合的服务层(映射器没有访问控制的概念)

我一直在开发Zend Framework 2应用程序。它有一个包裹模型层的服务层。控制器调用服务层,服务层与模型和映射器对话

我发现的问题是,访问控制需要很多努力,包括测试。该应用程序使用社交图,因此访问规则相当复杂。例如,如果用户A想要访问关于用户B的特定类别的信息,他们可能需要是某种类型的用户,并且可能需要到B的一定数量的连接

一些访问规则似乎属于模型层。要将它们放在服务层,我必须将模型功能泄漏到服务中。另一些似乎属于服务层,例如,从映射器中提取对象集合的服务层(映射器没有访问控制的概念)

有人有过这种访问控制复杂性的经验吗?不是系统不工作,只是50%的代码(以及测试、模拟等)被访问控制占用了。有没有更简单的方法

我考虑过让访问控制事件驱动——每个安全方法都会触发一个事件,如果需要,该事件的侦听器会抛出一个异常。(测试时我不会附加侦听器,因此我保存了大约一半的测试用例)。有人有过这样的经历吗


很久以前我尝试过ACL和RBAC,但没有找到满意的解决方案。大约一年前,我研究过XACML,但它似乎有些过分,即使在那时,我也不确定它是否能解决问题。

因为我是PHP面向方面编程方面的专家,我认为您应该看看这个范例,因为它是由Xerox PARC设计的,用于解决面向对象代码中的交叉关注点

您关于访问控制的问题描述了典型的分散功能,您是对的,这段代码在任何地方都是重复的,因为传统的面向对象范例无法回答如何优雅地做到这一点

OOP可能的解决方案是创建可以检查访问权限的装饰器。另一种方法是修改类的每个API方法,并准备一个安全处理程序,在事件调度期间检查访问权限。这两种解决方案并不完美

在JAVA世界中,AOP用于访问控制已经有很长一段时间了(例如AspectJ)。我已经开发了Go!PHP的AOP框架,是Spring框架的移植版本,由AOP联盟接口提供支持

让我们看看如何使用AOP实现这一点。Main类包含几个具有域逻辑的业务方法:

classmyservice{
公共函数updateProfile(){…}
公共函数deleteProfile(){…}
} 
然后,我们用条令注释
@Secured(PROFILE_EDIT)
标记我们的方法,并定义一个方面,该方面将在源代码中的任何地方拦截使用此注释的方法的执行:

使用Go\Aop\Aspect;
使用Go\Aop\Intercept\MethodInvocation;
使用Go\Lang\Annotation\Before;
/**
*安全方面
*/
类SecurityAspect实现方面
{
/**
*此建议拦截安全方法的执行
*
*逻辑非常简单:我们先检查访问权限,然后再检查原始方法和
*然后调用原始方法或引发异常。
*
*@param MethodInvocation$invocation调用
*
*@Before(“@annotation(Demo\annotation\Secured)”)
*/
公共函数beforeSecuredMethod(MethodInvocation$invocation)
{
$right=$invocation->getMethod()->getAnnotation('Demo\Annotation\Secured')->value;
如果(!Security::isgrated($right)){
抛出新的AuthorizationException(“访问被拒绝。{$right}是必需的。”);
}
}
}
您可以阅读一篇更详细的文章,了解如何实现授权。我还需要检查性能和性能