diff --git a/app/config/security.yml b/app/config/security.yml index ffb1d356f..171a69e2e 100644 --- a/app/config/security.yml +++ b/app/config/security.yml @@ -41,6 +41,7 @@ security: form_login: provider: fos_userbundle csrf_token_generator: security.csrf.token_manager + failure_handler: wallabag_user.security.custom_auth_failure_handler anonymous: true remember_me: diff --git a/src/Wallabag/UserBundle/Resources/config/services.yml b/src/Wallabag/UserBundle/Resources/config/services.yml index 72f6f12c1..6ab463e36 100644 --- a/src/Wallabag/UserBundle/Resources/config/services.yml +++ b/src/Wallabag/UserBundle/Resources/config/services.yml @@ -35,3 +35,11 @@ services: - "%wallabag_core.list_mode%" tags: - { name: kernel.event_subscriber } + + wallabag_user.security.custom_auth_failure_handler: + class: Wallabag\UserBundle\Security\CustomAuthenticationFailureHandler + arguments: + - "@http_kernel" + - "@security.http_utils" + - { } + - "@logger" diff --git a/src/Wallabag/UserBundle/Security/CustomAuthenticationFailureHandler.php b/src/Wallabag/UserBundle/Security/CustomAuthenticationFailureHandler.php new file mode 100644 index 000000000..93e2d17b7 --- /dev/null +++ b/src/Wallabag/UserBundle/Security/CustomAuthenticationFailureHandler.php @@ -0,0 +1,62 @@ +options['failure_path_parameter'])) { + $this->options['failure_path'] = $failureUrl; + } + + if (null === $this->options['failure_path']) { + $this->options['failure_path'] = $this->options['login_path']; + } + + if ($this->options['failure_forward']) { + $this->logger->debug('Authentication failure, forward triggered.', ['failure_path' => $this->options['failure_path']]); + + $this->logError($request); + + $subRequest = $this->httpUtils->createRequest($request, $this->options['failure_path']); + $subRequest->attributes->set(Security::AUTHENTICATION_ERROR, $exception); + + return $this->httpKernel->handle($subRequest, HttpKernelInterface::SUB_REQUEST); + } + + $this->logger->debug('Authentication failure, redirect triggered.', ['failure_path' => $this->options['failure_path']]); + + $this->logError($request); + + $request->getSession()->set(Security::AUTHENTICATION_ERROR, $exception); + + return $this->httpUtils->createRedirectResponse($request, $this->options['failure_path']); + } + + /** + * Log error information about fialure + * + * @param Request $request + */ + private function logError(Request $request) + { + $this->logger->error('Authentication failure for user "'.$request->request->get('_username').'", from IP "'.$request->getClientIp().'", with UA: "'.$request->server->get('HTTP_USER_AGENT').'".'); + } +}