重定向请求形成Zend应用程序中的全能控制器,而不会永远循环

时间:2011-12-22 15:48:46

标签: zend-framework zend-auth zend-application

我要问的内容有很多相关的帖子,但是经过一些冗长的搜索后找不到我想要的内容,如果它存在于某个地方我会道歉。

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

目前我正在使用preDispatch中设置的auth自定义插件来检查POST'ed auth凭证(如果我们正在登录),然后在所有情况下插件都会存储原始请求并重定向所有人(auth' d或不)我的auth控制器,a-la:

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

我的问题/问题是,在我的auth->检查操作中,如何在做出决定后执行重定向?如果我使用:

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

然后我显然得到一个无限循环,因为这些请求再次通过preDispatch插件。当然我可以通过重定向传递一些东西,以便Auth插件忽略这些请求,但这显然是一个安全漏洞。我曾经想过可能生成和存储md5哈希,将其存储到会话并将其作为转义参数传递,但这看起来有点粗略。

那里有更好的想法吗?也许一个重定向方法没有通过Zend App中的标准predispatch例程?提前谢谢!

1 个答案:

答案 0 :(得分:0)

这不是通常在Zend Framework中完成的方式。并非所有请求都转到公共场所,并被重定向到原始请求的位置身份验证。

对于访问控制,请使用Zend_Acl。通过这种方式,您可以轻松确定当前用户是否具有访问内容所需的身份验证,否则将重定向为“迷失”操作。

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

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

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