1

我正在authentication为在ZF2.

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

对于从浏览器访问的 Web 应用程序的 IE,我将通过 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 ( 'LdapAuth\Client\Ldap' );
            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 );
        }
    }
}
4

1 回答 1

0
  1. dispatch很多人这样做是因为他们想在控制器事件之前检查身份验证。可以在过程中更早地检查身份验证,例如在route事件上,或者至少在控制器被实例化之前(以更高的优先级调度,然后控制器)。

    如果用户未经身份验证,您希望尽早回复401(未经授权)或403(禁止)或(临时移动)响应(在 Wiki302上阅读有关此状态代码的更多背景信息),以防止所有开销仅使您的服务器(不必要地)被占用,从而减慢您的应用程序并延迟未经身份验证的响应。

    module.php不是添加所有相关代码的最佳位置。authentication更好的做法是创建一个身份验证侦听器(并在侦听器中注入身份验证服务)并仅在您的module.php.

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

  3. 您不需要将此网址存储在服务器上,您可以在重定向响应中发送您登录后要访问的网址(原始网址)。例如,您login.php从针对 的请求重定向到profile.php,那么您的重定向 url 可能如下所示:

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

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

于 2016-05-24T08:30:29.410 回答