urlGenerator->generate('app_login'); } public function authenticate(Request $request): Passport { $email = trim($request->request->getString('_username')); $passwordPlain = trim($request->request->getString('_password')); // Very lame hashing applied here as required by BPN $password = md5($passwordPlain); try { $response = $this->apiClient->getPersonalData($email, $password); } catch (ApiClientException $e) { throw new CustomUserMessageAuthenticationException($e->getMessage()); } if (false === $response instanceof PersonalData) { throw new CustomUserMessageAuthenticationException('Der Login ist fehlgeschlagen :('); } $csrfToken = $request->request->getString('_csrf_token'); return new SelfValidatingPassport( new UserBadge($email, function () use ($email, $password, $response) { return $this->createOrUpdateLocalUser($email, $password, $response->personId, $response->addressId); }), [ new CsrfTokenBadge('authenticate', $csrfToken), ] ); } private function createOrUpdateLocalUser(string $email, string $password, ?int $personId, ?int $addressId): User { try { $crmAttributes = $this->apiClient->getCrmAttributes($email, $password); } catch (ApiClientException $e) { throw new CustomUserMessageAuthenticationException($e->getMessage()); } $roles = $crmAttributes->roles; $hotelCodes = $crmAttributes->hotelCodes; $encryptedPassword = $this->crypt->encrypt($password); $userRepository = $this->entityManager->getRepository(User::class); if (null === $user = $userRepository->findOneBy(['email' => $email])) { $user = new User($email); $this->entityManager->persist($user); } $user ->setPassword($encryptedPassword) ->setPersonId($personId) ->setAddressId($addressId) ->setRoles($roles) ->setHotelCodes($hotelCodes) ->setLastLoginAt(new \DateTimeImmutable()) ; $this->entityManager->flush(); return $user; } public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response { $this->authLogger->info('Login', [ 'email' => $token->getUserIdentifier(), ]); if ($targetPath = $this->getTargetPath($request->getSession(), $firewallName)) { return new RedirectResponse($targetPath); } return new RedirectResponse($this->urlGenerator->generate('app_account')); } }