src/Security/CasAuthenticator.php line 17

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use Symfony\Component\HttpFoundation\RedirectResponse;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\HttpClient\HttpClient;
  7. use Symfony\Component\Security\Core\Exception\AuthenticationException;
  8. use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
  9. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  10. use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator;
  11. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
  12. use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
  13. use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport;
  14. use Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface;
  15. class CasAuthenticator extends AbstractAuthenticator implements AuthenticationEntryPointInterface
  16. {
  17.     protected $userProvider;
  18.     protected $casUrl;
  19.     public function __construct(CasUserProvider $userProviderstring $casUrl)
  20.     {
  21.         $this->userProvider $userProvider;
  22.         $this->casUrl $casUrl;
  23.     }
  24.     public function supports(Request $request): bool
  25.     {
  26.         return (bool) $request->get('ticket');
  27.     }
  28.     public function authenticate(Request $request): Passport
  29.     {
  30.         $url $this->casUrl 'serviceValidate?ticket=' $request->get('ticket') . '&service=' urlencode($this->removeCasTicket($request->getUri()));
  31.         $client HttpClient::create();
  32.         $response $client->request('GET'$url);
  33.         $string $response->getContent();
  34.         $xml = new \SimpleXMLElement($string0false'cas'true);
  35.         if (isset($xml->authenticationSuccess)) {
  36.             $data = (array) $xml->authenticationSuccess;
  37.             $username $data['user'];
  38.             $user $this->userProvider->loadUserByIdentifier($username);
  39.             return new SelfValidatingPassport(new UserBadge($user->getUserIdentifier()));
  40.         } else {
  41.             throw new CustomUserMessageAuthenticationException('Ticket not recognized');
  42.         }
  43.     }
  44.     public function onAuthenticationSuccess(Request $requestTokenInterface $tokenstring $firewallName): ?Response
  45.     {
  46.         return null;
  47.     }
  48.     public function onAuthenticationFailure(Request $requestAuthenticationException $exception): Response
  49.     {
  50.         $message strtr($exception->getMessageKey(), $exception->getMessageData());
  51.         return new Response($messageResponse::HTTP_FORBIDDEN);
  52.     }
  53.     public function start(Request $requestAuthenticationException $authException null): Response
  54.     {
  55.         return new RedirectResponse($this->casUrl 'login?service=' urlencode($request->getUri()));
  56.     }
  57.     protected function removeCasTicket(string $uri): string
  58.     {
  59.         $parsed_url parse_url($uri);
  60.         if (empty($parsed_url['query'])) {
  61.             return $uri;
  62.         }
  63.         parse_str($parsed_url['query'], $query_params);
  64.         if (! isset($query_params['ticket'])) {
  65.             return $uri;
  66.         }
  67.         unset($query_params['ticket']);
  68.         if (empty($query_params)) {
  69.             unset($parsed_url['query']);
  70.         } else {
  71.             $parsed_url['query'] = http_build_query($query_params);
  72.         }
  73.         $scheme = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' '';
  74.         $host = isset($parsed_url['host']) ? $parsed_url['host'] : '';
  75.         $port = isset($parsed_url['port']) ? ':' $parsed_url['port'] : '';
  76.         $user = isset($parsed_url['user']) ? $parsed_url['user'] : '';
  77.         $pass = isset($parsed_url['pass']) ? ':' $parsed_url['pass'] : '';
  78.         $pass = ($user || $pass) ? "$pass@" '';
  79.         $path = isset($parsed_url['path']) ? $parsed_url['path'] : '';
  80.         $query = isset($parsed_url['query']) ? '?' $parsed_url['query'] : '';
  81.         $fragment = isset($parsed_url['fragment']) ? '#' $parsed_url['fragment'] : '';
  82.         return "$scheme$user$pass$host$port$path$query$fragment";
  83.     }
  84. }