收听登录检查或登录表单帖子

时间:2018-01-14 20:41:14

标签: symfony login

背景: 当有人尝试从同一IP地址登录相同的用户名超过N次时,我想将任何请求重定向到/阻止的URL。

我想重定向并跳过检查凭据,所以我需要设置一个onAuthenticationCheck方法来检查登录尝试限制是否已被超越(计算DB存储的尝试次数),因此它会在检查之前取消登录过程密码,但我可以发送特定的Flash消息。

我尝试过使用kernelListeners,但它只处理GET请求。

 public function onKernelRequest(GetResponseEvent $event) {

        $this->preventForceLogin($event);
    }


private function preventForceLogin($event) {

    $request = $event->getRequest();

    if ($request->getMethod() === 'GET') {
        return;
    }
     // THE CODE BELOW IS NOW USELESS AS THE LOGIN POST
    // IS UNEXPECTEDLY NOT REACHING THIS METHOD !!

    $route = $this->getRoute($request);

    if ($route === 'login' || $route === 'forgot') {
        $username = $request->request->get('_username');
        if ($this->getAttempts($username) > 4) {
            $url = $this->router->generate('wait');
            $response = new RedirectResponse($url);
            $event->setResponse($response);
        }
    }
}

因此,如果我设法拦截登录POST,我仍然需要知道如何防止传播,以避免在设置响应之前进行登录检查。

我认为最好的选择可能是创建一个特定的表单订阅者。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我无法捕捉POST事件的原因很简单。我的监听器没有优先级(services.yml上的yml标签优先级),因此Symfony开箱即用的监听器之前完成了他们的工作,因此我的监听器没有可用的POST。在这种情况下,我的问题是优先级为8的探查器事件中列出的Symfony\Bundle\SecurityBundle\EventListener\FirewallListener::onKernelRequest(),因此我的案例的解决方案是将标记优先级:9添加到我的内核侦听器。