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, $request) { $crmAttributes = $this->apiClient->getCrmAttributes($email, $password); $roles = $this->collectRoles($crmAttributes); $user = new User($email, $response->personId, $response->addressId, $password, $roles); $request->getSession()->set('bpn_user', $user); return $user; }), [ new CsrfTokenBadge('authenticate', $csrfToken), new RememberMeBadge(), ] ); } public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response { $this->logger->info('Login', [ 'email' => $token->getUserIdentifier(), ]); return new RedirectResponse($this->urlGenerator->generate('app_personal_data')); } private function collectRoles(CrmAttributes $crmAttributes): array { // Collect user's roles from CRM attributes $roles = []; if ($crmAttributes->admin) { $roles[] = 'ROLE_ADMIN'; } elseif ($crmAttributes->manager) { $roles[] = 'ROLE_MANAGER'; } elseif ($crmAttributes->houseManager) { $roles[] = 'ROLE_HOUSE_MANAGER'; } if ($crmAttributes->teamer) { $roles[] = 'ROLE_TEAMER'; } return $roles; } }