1

我要问的内容有很多相关的帖子,但是经过长时间的搜索后无法完全找到我要找的东西,如果它存在于某个地方,我深表歉意。

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

目前我正在使用 preDispatch 中设置的身份验证自定义插件来简单地检查 POST 的身份验证凭据(如果我们正在登录),那么在所有情况下,插件都会存储原始请求并重定向每个人(是否经过身份验证)到我的身份验证控制器,a-la:

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

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

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

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

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

4

1 回答 1

0

这不是 Zend Framework 中通常的做法。并非所有请求都转到一个公共位置并被重定向到原始请求的位置身份验证。

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

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

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

$this->_forward($action, $controller, $module, $params)
于 2011-12-22T17:21:56.310 回答