在Zend应用程序中重定向请求形成一个无所不在的控制器,无需永久循环

问题描述:

我有很多相关的帖子,但是经过一些冗长的搜索后,找不到我想要的东西,我很抱歉存在某处。在Zend应用程序中重定向请求形成一个无所不在的控制器,无需永久循环

我的目标 - 对我的Zend App的所有请求都必须通过preDispatch插件,然后传递给自定义Auth控制器,该控制器将决定现有的认证凭证是否足以满足请求的操作。 '充足'取决于应用程序的逻辑,因此我想在控制器+模型级别执行此操作。如果他们足够了,他们会将原始请求发送到指定的控制器+操作,如果不是,则默认为“丢失”操作。

目前我使用的身份验证自定义插件在preDispatch设置简单地检查POST'ed身份验证凭据(如果我们登录),然后在所有情况下的插件存储的原始请求,并重定向大家(AUTH “d与否)我AUTH控制器,一拉:

$request->setModuleName('default') 
      ->setControllerName('auth') 
      ->setActionName('check') 
      ->setParam('oreq',$request->getParams()); 

我的问题/问题是,我auth-内>检查行动,我应该如何执行重定向的决定作出后?如果我使用:

$this->_helper->redirector($or['action'], $oreq['controller']); 

然后根据这些要求通过preDispatch插件,我再次明显得到一个无限循环。当然,我可以通过重定向传递一些信息,以便Auth插件忽略这些请求,但这显然是一个安全漏洞。我曾想过可能会生成并存储一个md5散列,将它存储到会话中,并将其作为一个转义参数传递,但这似乎有点粗略。

有更好的想法吗?也许是一种重定向方法,它不会通过Zend App中的标准预调度程序?提前致谢!

这不是通常在Zend Framework中完成的。并非所有请求都转到常见的地方,并被重定向到原始请求的地点认证。

对于访问控制,请使用Zend_Acl。通过这一点,您可以轻松确定当前用户是否具有访问内容所需的权限,否则会重定向到“迷路”操作。

如果您仍然坚持使用您的技术,请使用_forward方法而不是重定向方法。

由于_forward是内部重定向,因此您可以传递其他参数并检查preDispath中是否存在循环。

$this->_forward($action, $controller, $module, $params) 
+1

你是明星,非常感谢。 – Dan 2011-12-22 18:16:05

+1

fyi,_forward确实流过调度 – Dan 2011-12-22 22:17:00