* @author Robin Chalas * * @final */ class AuthenticationSuccessHandler implements AuthenticationSuccessHandlerInterface { protected JWTTokenManagerInterface $jwtManager; protected EventDispatcherInterface $dispatcher; protected bool $removeTokenFromBodyWhenCookiesUsed; private iterable $cookieProviders; /** * @param iterable|JWTCookieProvider[] $cookieProviders */ public function __construct(JWTTokenManagerInterface $jwtManager, EventDispatcherInterface $dispatcher, iterable $cookieProviders = [], bool $removeTokenFromBodyWhenCookiesUsed = true) { $this->jwtManager = $jwtManager; $this->dispatcher = $dispatcher; $this->cookieProviders = $cookieProviders; $this->removeTokenFromBodyWhenCookiesUsed = $removeTokenFromBodyWhenCookiesUsed; } /** * {@inheritdoc} */ public function onAuthenticationSuccess(Request $request, TokenInterface $token): Response { return $this->handleAuthenticationSuccess($token->getUser()); } public function handleAuthenticationSuccess(UserInterface $user, $jwt = null): Response { if (null === $jwt) { $jwt = $this->jwtManager->create($user); } $jwtCookies = []; foreach ($this->cookieProviders as $cookieProvider) { $jwtCookies[] = $cookieProvider->createCookie($jwt); } $response = new JWTAuthenticationSuccessResponse($jwt, [], $jwtCookies); $event = new AuthenticationSuccessEvent(['token' => $jwt], $user, $response); $this->dispatcher->dispatch($event, Events::AUTHENTICATION_SUCCESS); $responseData = $event->getData(); if ($jwtCookies && $this->removeTokenFromBodyWhenCookiesUsed) { unset($responseData['token']); } if ($responseData) { $response->setData($responseData); } else { $response->setStatusCode(Response::HTTP_NO_CONTENT); } return $response; } }