我通过阅读http://framework.zend.com/manual/en/zend.controller.modular.html创建了一个带Zend的MVC。
问题是我找不到使用模块化结构的Zend_ACL的方法。 Zend_Acl根本没有添加模块的方法。它只允许我添加控制器和动作。
如何将Zend_Acl与模块化结构一起使用?是否有可能使用当前版本的Zend Framework?
答案 0 :(得分:2)
绝对是。这就是我们在项目中所做的。我们对URI路径($request->getPathInfo()
)进行身份验证,例如:/admin/user/edit
。这里“admin”是一个模块,“user”是一个控制器,“edit”是一个动作。我们有一个访问插件:
class Our_Application_Plugin_Access extends Zend_Controller_Plugin_Abstract {
public function preDispatch(Zend_Controller_Request_Abstract $request) {
foreach (self::current_roles() as $role) {
if (
Zend_Registry::get('bootstrap')->siteacl->isAllowed(
$role,
$request->getPathInfo()
)
) return;
}
$this->not_allowed($request);
}
...
}
在application.ini中注册:
resources.frontController.plugins.access = "Our_Application_Plugin_Access"
答案 1 :(得分:1)
Ivan的其他选择是将资源而不仅仅是“控制器”设置为......比如“module-Controller”。
答案 2 :(得分:1)
有可能,我每次都用它。 首先要记住 Zend_Acl将验证的资源是一个任意实体(字符串),不一定与特定模块或控制器相关。它可以是字符串“hello”,在程序中,您可以检查用户是否可以访问资源“hello”。我经常使用一些任意资源作为“登录按钮”,“注销按钮”来显示Zend_Navigation中的链接。
在您的情况下,您应该将资源(在acl中)定义为可以映射到模块/控制器布局的字符串。 例如,对于模块foo和控制器栏,定义资源“foo.bar”。在访问检查过程中,您将读取模块和控制器名称并将它们合并到一个字符串中以获取资源。
在一个实际的例子中:
class Application_Plugin_AccessCheck extends Zend_Controller_Plugin_Abstract {
...
public function preDispatch(Zend_Controller_Request_Abstract $request){
$module = $request->getModuleName();
$controller = $request->getControllerName();
$action = $request->getActionName();
...
$resource = $module . '.' . $controller; //we create the custom resource according to the model we have defined
...
$role=NULL;
if($this->_auth->hasIdentity()){
$identity = $this->_auth->getStorage()->read(); //depending on your implementation
$role = $identity->role; //depending on your implementation
}
...
if(!$this->_acl->isAllowed($role, $resource, $action)){
//deny access
}
//allow access
}
}