src/Security/KeycloakAuthenticator.php line 93

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use KnpU\OAuth2ClientBundle\Client\Provider\KeycloakClient;
  4. use KnpU\OAuth2ClientBundle\Security\Authenticator\SocialAuthenticator;
  5. use KnpU\OAuth2ClientBundle\Client\ClientRegistry;
  6. use Symfony\Component\Routing\RouterInterface;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Symfony\Component\HttpFoundation\RedirectResponse;
  10. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  11. use Symfony\Component\Security\Core\Exception\AuthenticationException;
  12. use Symfony\Component\Security\Core\User\UserProviderInterface;
  13. /**
  14.  * Class KeycloakAuthenticator
  15.  */
  16. class KeycloakAuthenticator extends SocialAuthenticator
  17. {
  18.     private $clientRegistry;
  19.     private $router;
  20.     public function __construct(ClientRegistry $clientRegistryRouterInterface $router)
  21.     {
  22.         $this->clientRegistry $clientRegistry;
  23.         $this->router $router;
  24.     }
  25.     public function start(Request $requestAuthenticationException $authException null)
  26.     {
  27.         $connectUrl $this->router->generate('connect_keycloak');
  28.         return new RedirectResponse(
  29.             $connectUrl// might be the site, where users choose their oauth provider
  30.             Response::HTTP_TEMPORARY_REDIRECT
  31.         );
  32.     }
  33.     public function supports(Request $request)
  34.     {
  35.         return $request->attributes->get('_route') === 'connect_auth_check';
  36.     }
  37.     public function getCredentials(Request $request)
  38.     {
  39.         $accessToken $this->fetchAccessToken($this->getKeycloakClient());
  40.         $this->setTokenToSession($request$accessToken);
  41.         return $accessToken;
  42.     }
  43.     private function setTokenToSession(Request $request$credentials){
  44.         $session $request->getSession();
  45.         $session->set('access_token'$credentials);
  46.     }
  47.     public function getUser($credentialsUserProviderInterface $userProvider)
  48.     {
  49.         $keycloakUser $this->getKeycloakClient()->fetchUserFromToken($credentials);
  50.         $responseArray $keycloakUser->toArray();
  51.         $user = new User();
  52.         $user->setKeycloakId($keycloakUser->getId());
  53.         $user->setEmail($keycloakUser->getEmail());
  54.         if (isset($responseArray['gender'])) {
  55.             $user->setGenre($responseArray['gender']);
  56.         }
  57.         $user->setPrenom($responseArray['given_name']);
  58.         $user->setNom($responseArray['family_name']);
  59.         $tabRole = ['ROLE_USER'];
  60.         foreach ($keycloakUser->toArray()['roles'] as $role) {
  61.             $tabRole[] = "ROLE_" $role;
  62.         }
  63.         $user->setRoles($tabRole);
  64.         return $user;
  65.     }
  66.     public function onAuthenticationFailure(Request $requestAuthenticationException $exception)
  67.     {
  68.         $session $request->getSession();
  69.         $path $session->get('path');
  70.         $targetUrl $path;
  71.         if($path == null){
  72.             $targetUrl $request->getSchemeAndHttpHost();
  73.         }
  74.         //$targetUrl = $this->router->generate($path);
  75.         // retirer la session, pour éviter d'itérer à l'intérieur du silentAuthenticator.
  76.         $session->clear();
  77.         // ajouter dans la session le fait que l'utilisateur n'est pas authentifié.
  78.         $session->set('unauthentified'true);
  79.         $session->set('path'$path);
  80.         return new RedirectResponse($targetUrl);
  81.     }
  82.     public function onAuthenticationSuccess(Request $requestTokenInterface $tokenstring $providerKey)
  83.     {
  84.         $session $request->getSession();
  85.         $session->remove('unauthentified');
  86.         $targetUrl $request->getSession()->get('_security.'.$providerKey.'.target_path');
  87.         if($targetUrl == null){
  88.             $targetUrl urldecode($session->get('path'));
  89.         }
  90.         if ($targetUrl == null) {
  91.             $targetUrl $request->getSchemeAndHttpHost();
  92.         }
  93.         return new RedirectResponse($targetUrl);
  94.     }
  95.     /**
  96.      * @return KeycloakClient
  97.      */
  98.     private function getKeycloakClient()
  99.     {
  100.         return $this->clientRegistry->getClient('keycloak');
  101.     }
  102. }