我正在为在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 );
}
}
}
-
很多人这样做是因为他们希望在控制器
dispatch
事件之前检查身份验证。身份验证可以在过程中更早地进行检查,例如在route
事件上,或者至少在控制器实例化之前进行检查(调度优先级高于控制器)。如果用户未经身份验证,您希望尽早以
401
(未经授权)、403
(禁止)或302
(暂时移动)响应(在Wiki上阅读更多关于此状态代码的背景信息)进行响应,以防止所有开销,这些开销只会使您的服务器(不必要地)被占用,从而降低应用程序的速度并延迟未经验证的回答module.php
是NOT添加所有authentication
相关代码的最佳位置。最好是创建一个身份验证侦听器(并在侦听器中注入身份验证服务),并且只连接module.php
中的侦听器。 -
阅读这个答案中重定向和转发之间的区别。如果要重定向客户端,在具有
302
状态代码的响应中它不是正确的authenticated
,则需要发送包括此状态代码的重定向响应。我也看到有人在这种情况下使用forward,但在我看来这是不正确的,因为客户端不会收到任何重定向的通知。您还可以检查像ZfcUser
这样的身份验证模块,看看它们是如何处理这一问题的。 -
你不需要在服务器上存储这个url,你可以在登录后在重定向响应中发送你想去的url(原始url)。例如,您从以
profile.php
为目标的请求重定向到login.php
,然后您的重定向url可能如下所示:http://www.example.com/login.php?redirect=profile.php
现在,您可以在登录进程/控制器中设置重定向,以便在成功登录后将客户端返回到
profile.php
。