Zend Framework 2 - 在抽象控制器中检查身份验证 - > onDispatch?



我正在为在ZF2下运行的应用程序重新编写authentication进程。

我需要有更多的选项来根据调用的服务对用户进行身份验证。

I.E.对于从浏览器访问的web应用程序,我将通过Ldap进行身份验证,对于API服务,我将检查头部中的用户凭据。

我创建了一个abstract controller,检查用户是否通过了身份验证;如果没有,它将被重定向到登录页面。

模块中需要相同身份验证过程的所有控制器都将扩展此类。

我需要保存原始请求,以便在成功登录后将其重定向回它。

我的问题是:

1.抽象控制器->onDispatch()方法正确吗放在哪里

我找到的每一个解决方案都是在Module.php中进行的。为了区分auth方法,他们需要检查请求的控制器是否匹配,因为Module.php总是被调用的。把它放在控制器里不是更干净吗?

2.我应该使用重定向还是转发从原始控制器传递登录控制器然后返回

我不介意浏览器栏中的url更改,只是在寻找最好、最快的解决方案,同时保持原始请求。

3.将uri存储在会话类中(来自auth模块)?是否有任何方法可以保存整个请求(可能包括POST数据,以备不时之需)

这是抽象控制器:

abstract class AbstractAuthActionController extends AbstractActionController {
public function onDispatch(MvcEvent $e) {
$serviceManager = $e->getApplication ()->getServiceManager ();
$auth = $serviceManager->get ( 'LdapAuthClientLdap' );
if (! $auth->hasIdentity ()) {
$uri = $e->getRequest()->getRequestUri();
$callBackFunction = $this->getLdap ()->getCallBackFunction (); // = new SessionData();
$callBackFunction::setOriginalUri($uri); // function to store temporarly the uri
return $this->redirect ()->toRoute ( 'ldap-login-route' );
} else {
return parent::onDispatch ( $e );
}
}
}
  1. 很多人这样做是因为他们希望在控制器dispatch事件之前检查身份验证。身份验证可以在过程中更早地进行检查,例如在route事件上,或者至少在控制器实例化之前进行检查(调度优先级高于控制器)。

    如果用户未经身份验证,您希望尽早以401(未经授权)、403(禁止)或302(暂时移动)响应(在Wiki上阅读更多关于此状态代码的背景信息)进行响应,以防止所有开销,这些开销只会使您的服务器(不必要地)被占用,从而降低应用程序的速度并延迟未经验证的回答

    module.phpNOT添加所有authentication相关代码的最佳位置。最好是创建一个身份验证侦听器(并在侦听器中注入身份验证服务),并且只连接module.php中的侦听器。

  2. 阅读这个答案中重定向和转发之间的区别。如果要重定向客户端,在具有302状态代码的响应中它不是正确的authenticated,则需要发送包括此状态代码的重定向响应。我也看到有人在这种情况下使用forward,但在我看来这是不正确的,因为客户端不会收到任何重定向的通知。您还可以检查像ZfcUser这样的身份验证模块,看看它们是如何处理这一问题的。

  3. 你不需要在服务器上存储这个url,你可以在登录后在重定向响应中发送你想去的url(原始url)。例如,您从以profile.php为目标的请求重定向到login.php,然后您的重定向url可能如下所示:

    http://www.example.com/login.php?redirect=profile.php

    现在,您可以在登录进程/控制器中设置重定向,以便在成功登录后将客户端返回到profile.php

相关内容

  • 没有找到相关文章

最新更新