背景: 当有人尝试从同一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,我仍然需要知道如何防止传播,以避免在设置响应之前进行登录检查。
我认为最好的选择可能是创建一个特定的表单订阅者。有什么想法吗?
答案 0 :(得分:0)
我无法捕捉POST事件的原因很简单。我的监听器没有优先级(services.yml上的yml标签优先级),因此Symfony开箱即用的监听器之前完成了他们的工作,因此我的监听器没有可用的POST。在这种情况下,我的问题是优先级为8的探查器事件中列出的Symfony\Bundle\SecurityBundle\EventListener\FirewallListener::onKernelRequest()
,因此我的案例的解决方案是将标记优先级:9添加到我的内核侦听器。