src/Security/EmpireAuthenticator.php line 54

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use Empire\Core\User;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Doctrine\DBAL\FetchMode;
  6. use Symfony\Component\HttpFoundation\JsonResponse;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  10. use Symfony\Component\Security\Core\Exception\AuthenticationException;
  11. use Symfony\Component\Security\Core\User\UserInterface;
  12. use Symfony\Component\Security\Core\User\UserProviderInterface;
  13. use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator;
  14. use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
  15. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
  16. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\PreAuthenticatedUserBadge;
  17. use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
  18. use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport;
  19. use Symfony\Component\Security\Http\Authenticator\Passport\Credentials\CustomCredentials;
  20. use Symfony\Component\HttpFoundation\RedirectResponse;
  21. use Symfony\Component\HttpFoundation\RequestStack;
  22. use App\Security\UserProvider;
  23. use Empire\Core\Core;
  24. class EmpireAuthenticator extends AbstractAuthenticator
  25. {
  26.     private $entityManager;
  27.     private $requestStack;
  28.     private $userProvider;
  29.     public function __construct(EntityManagerInterface $entityManagerRequestStack $requestStackUserProvider $userProvider)
  30.     {
  31.         $this->entityManager $entityManager;
  32.         $this->requestStack $requestStack;
  33.         $this->userProvider $userProvider;
  34.     }
  35.     /**
  36.      * Called on every request to decide if this authenticator should be
  37.      * used for the request. Returning `false` will cause this authenticator
  38.      * to be skipped.
  39.      */
  40.     public function supports(Request $request): ?bool
  41.     {
  42.         $cook false;
  43.         if ($request->cookies->has('irms_token')){
  44.             $tok $request->cookies->get('irms_token');
  45.             if ($tok != '' || !is_null($tok)) {
  46.                 $cook true;
  47.             }
  48.         }
  49.         return $cook || $this->requestStack->getSession()->has('member_id');
  50.     }
  51.     public function getCredentials(Request $request)
  52.     {
  53.         if ($request->cookies->has('irms_token')){
  54.             list($token$signature) = explode(":"$request->cookies->get('irms_token'), 2);
  55.             if ($signature != hash_hmac('md5'$token$_ENV['APP_SECRET'])) {
  56.                 throw new \Exception('Invalid cookie!');
  57.             }
  58.             return $token;
  59.         }
  60.         return "_no_cookie"// special val, to show no cookie usage and to check session
  61.     }
  62.     public function getUser($credentialsUserProviderInterface $userProvider)
  63.     {
  64.         if (null === $credentials) {
  65.             // The token header was empty, authentication fails with HTTP Status
  66.             // Code 401 "Unauthorized"
  67.             return null;
  68.         }
  69.         if ($credentials == "_no_cookie"){
  70.             $membid $this->requestStack->getSession()->get('member_id');
  71.             return $userProvider->loadUserByUsername($membid);
  72.         }
  73.         // no session, so a remember_me
  74.         return $userProvider->loadUserByIrmsToken($credentials);
  75.     }
  76.     public function checkCredentials($credentialsUserInterface $user)
  77.     {
  78.         return true;
  79.     }
  80.     public function authenticate(Request $request): Passport
  81.     {
  82.         $cookie $request->cookies->get('irms_token');
  83.         if (is_null($cookie)){
  84.             $membid $this->requestStack->getSession()->get('member_id');
  85.             if(is_null($membid)){
  86.                 throw new CustomUserMessageAuthenticationException('No token provided');
  87.             }
  88.             return new SelfValidatingPassport(new UserBadge($this->userProvider->loadUserByUsername($membid)), [new PreAuthenticatedUserBadge()]);
  89.         } else {
  90.             list($token$signature) = explode(":"$cookie2);
  91.             if ($signature != hash_hmac('md5'$token$_ENV['APP_SECRET'])) {
  92.                 throw new \Exception('Invalid cookie!');
  93.             }
  94.             $conn $this->entityManager->getConnection();
  95.             $sql  "SELECT MEMB_ID FROM COOKIE WHERE COOK_TOKEN = '$token';";
  96.             $stmt $conn->prepare($sql);
  97.             $stmt->execute();
  98.             $return $stmt->fetch();
  99.             $id $return["MEMB_ID"];
  100.             $usql "SELECT * FROM MEMBER WHERE MEMB_ID = '$id';";
  101.             $ust  $conn->prepare($usql);
  102.             $ust->setFetchMode(\PDO::FETCH_CLASS, \Empire\Core\User::class);
  103.             $ust->execute();
  104.             $user   $ust->fetch();
  105.             if (is_null($user)) {
  106.                 throw new UserNotFoundException();
  107.             }
  108.             return new SelfValidatingPassport(new UserBadge($user));
  109.         }
  110.     }
  111.     public function onAuthenticationSuccess(Request $requestTokenInterface $tokenstring $firewallName): ?Response
  112.     {
  113.         // on success, let the request continue
  114.         return null;
  115.     }
  116.     public function onAuthenticationFailure(Request $requestAuthenticationException $exception): ?Response
  117.     {
  118.         $data = [
  119.             // you may want to customize or obfuscate the message first
  120.             'message' => strtr($exception->getMessageKey(), $exception->getMessageData())
  121.             // or to translate this message
  122.             // $this->translator->trans($exception->getMessageKey(), $exception->getMessageData())
  123.         ];
  124.         return new JsonResponse($dataResponse::HTTP_UNAUTHORIZED);
  125.     }
  126.     /**
  127.      * Called when authentication is needed, but it's not sent
  128.      */
  129.     public function start(Request $requestAuthenticationException $authException null)
  130.     {
  131.         // send to login
  132.         //var_dump($request->server->all());
  133.         $reqUri urlencode($request->server->get('REQUEST_URI'));
  134.         return new RedirectResponse("/login?returnUrl={$reqUri}&client=Forum");
  135.     }
  136.     public function supportsRememberMe()
  137.     {
  138.         return true;
  139.     }
  140. }