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

Zend Framework 2 - Check for authentication in abstract controller -> onDispatch?

我 re-writing authentication 我的申请 运行 在 ZF2

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

即对于从浏览器访问的 Web 应用程序,我将通过 Ldap 进行身份验证,对于 API 服务,我将检查 header.

中的用户凭据

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

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

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

我的问题是:

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

我发现的每个解决方案总是在 Module.php 中解决。为了区分 auth 方法,他们需要检查请求的控制器是否匹配,因为 Module.php 总是被调用。不是'cleaner'在controller里设置吗?

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

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

3。将 uri 存储在 session class 中是否正确(来自 授权模块)?有没有办法保存整个请求(可能包括 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 );
        }
    }
}
  1. 很多人这样做是因为他们想在控制器 dispatch 事件之前检查身份验证。可以在过程中更早地检查身份验证,例如在 route 事件上,或者至少在控制器被实例化之前(比控制器具有更高优先级的调度)。

    如果用户未通过身份验证,您想用 401(未授权)或 403(禁止)或 302(暂时移动)响应(阅读更多此状态代码的背景 here on Wiki) 尽早防止所有开销,这些开销只会让您的服务器(不必要地)被占用,从而减慢您的应用程序并延迟 unauthenticated 响应.

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

  2. 中的侦听器
  3. 阅读重定向和转发之间的区别 here in this answer. If want to redirect the client that it is not properly authenticated in a response with a 302 status code you will need to send a redirect response including this status code. I also see people using forward in such cases, but in my opinion it is not correct, because the client won't get notified about any redirection. You could also check authentication modules like ZfcUser 以了解它们如何处理此问题。

  4. 这个url不需要存储在服务器上,登录后发送你想去的url就可以了(原来的url) 在重定向响应中。例如,您从针对 profile.php 的请求重定向到 login.php,那么您的重定向 url 可能如下所示:

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

    您现在可以在登录 process/controller 中设置重定向,这样在成功登录后您 return 客户端会转到 profile.php.