vendor/pimcore/customer-management-framework-bundle/src/Security/Guard/WebserviceAuthenticator.php line 93

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4.  * Pimcore
  5.  *
  6.  * This source file is available under two different licenses:
  7.  * - GNU General Public License version 3 (GPLv3)
  8.  * - Pimcore Commercial License (PCL)
  9.  * Full copyright and license information is available in
  10.  * LICENSE.md which is distributed with this source code.
  11.  *
  12.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  13.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  14.  */
  15. namespace CustomerManagementFrameworkBundle\Security\Guard;
  16. use Pimcore\Bundle\AdminBundle\Security\User\User as UserProxy;
  17. use Pimcore\Model\Tool\SettingsStore;
  18. use Pimcore\Model\User;
  19. use Pimcore\Tool\Authentication;
  20. use Psr\Log\LoggerAwareInterface;
  21. use Psr\Log\LoggerAwareTrait;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  25. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  26. use Symfony\Component\Security\Core\Exception\AuthenticationException;
  27. use Symfony\Component\Security\Core\User\UserInterface;
  28. use Symfony\Component\Security\Core\User\UserProviderInterface;
  29. use Symfony\Component\Security\Guard\AbstractGuardAuthenticator;
  30. class WebserviceAuthenticator extends AbstractGuardAuthenticator implements LoggerAwareInterface
  31. {
  32.     use LoggerAwareTrait;
  33.     const SETTINGS_STORE_KEY 'api_keys';
  34.     const SETTINGS_STORE_SCOPE 'cmf';
  35.     /**
  36.      * {@inheritdoc}
  37.      *
  38.      * @return bool
  39.      */
  40.     public function supports(Request $request)//: bool
  41.     {
  42.         return true;
  43.     }
  44.     /**
  45.      * @inheritDoc
  46.      *
  47.      * @return Response
  48.      */
  49.     public function start(Request $requestAuthenticationException $authException null)//: Response
  50.     {
  51.         throw $this->createAccessDeniedException($authException);
  52.     }
  53.     /**
  54.      * @inheritDoc
  55.      *
  56.      * @return array
  57.      */
  58.     public function getCredentials(Request $request)//: array
  59.     {
  60.         if ($apiKey $request->headers->get('x_api-key')) {
  61.             // check for API key header
  62.             return [
  63.                 'apiKey' => $apiKey,
  64.             ];
  65.         } elseif ($apiKey $request->get('apikey')) {
  66.             // check for API key parameter
  67.             return [
  68.                 'apiKey' => $apiKey,
  69.             ];
  70.         } else {
  71.             // check for existing session user
  72.             if (null !== $pimcoreUser Authentication::authenticateSession()) {
  73.                 return [
  74.                     'user' => $pimcoreUser,
  75.                 ];
  76.             }
  77.         }
  78.         throw $this->createAccessDeniedException();
  79.     }
  80.     private function createAccessDeniedException(\Throwable $previous null)
  81.     {
  82.         return new AccessDeniedHttpException('API request needs either a valid API key or a valid session.'$previous);
  83.     }
  84.     /**
  85.      * @inheritDoc
  86.      *
  87.      * @return UserInterface|null
  88.      */
  89.     public function getUser($credentialsUserProviderInterface $userProvider)//: ?UserInterface
  90.     {
  91.         /** @var UserProxy|null $user */
  92.         $user null;
  93.         if (!is_array($credentials)) {
  94.             throw new AuthenticationException('Invalid credentials.');
  95.         }
  96.         if (isset($credentials['user']) && $credentials['user'] instanceof User) {
  97.             $user = new UserProxy($credentials['user']);
  98.         } else {
  99.             if (isset($credentials['apiKey'])) {
  100.                 $pimcoreUser $this->loadUserForApiKey($credentials['apiKey']);
  101.                 if ($pimcoreUser) {
  102.                     $user = new UserProxy($pimcoreUser);
  103.                 }
  104.             }
  105.         }
  106.         if ($user && Authentication::isValidUser($user->getUser())) {
  107.             return $user;
  108.         }
  109.         return null;
  110.     }
  111.     /**
  112.      * @param string $apiKey
  113.      *
  114.      * @return User|null
  115.      *
  116.      * @throws \Exception
  117.      */
  118.     protected function loadUserForApiKey($apiKey)
  119.     {
  120.         $settingsStore SettingsStore::get(self::SETTINGS_STORE_KEYself::SETTINGS_STORE_SCOPE);
  121.         $apiKeys $settingsStore json_decode($settingsStore->getData(), true) : [];
  122.         $userId array_search($apiKey$apiKeys);
  123.         if ($userId) {
  124.             return User::getById($userId);
  125.         }
  126.         return null;
  127.     }
  128.     /**
  129.      * @inheritDoc
  130.      *
  131.      * @return bool
  132.      */
  133.     public function checkCredentials($credentialsUserInterface $user)//: bool
  134.     {
  135.         // we rely on getUser returning a valid user
  136.         if ($user instanceof UserProxy) {
  137.             return true;
  138.         }
  139.         return false;
  140.     }
  141.     /**
  142.      * @inheritDoc
  143.      *
  144.      * @return Response|null
  145.      */
  146.     public function onAuthenticationFailure(Request $requestAuthenticationException $exception)//: ?Response
  147.     {
  148.         $this->logger->warning('Failed to authenticate for webservice request {path}', [
  149.             'path' => $request->getPathInfo(),
  150.         ]);
  151.         throw $this->createAccessDeniedException($exception);
  152.     }
  153.     /**
  154.      * @inheritDoc
  155.      *
  156.      * @return Response|null
  157.      */
  158.     public function onAuthenticationSuccess(Request $requestTokenInterface $token$providerKey)//: ?Response
  159.     {
  160.         $this->logger->debug('Successfully authenticated user {user} for webservice request {path}', [
  161.             'user' => $token->getUser()->getUsername(),
  162.             'path' => $request->getPathInfo(),
  163.         ]);
  164.         return null;
  165.     }
  166.     /**
  167.      * @inheritDoc
  168.      *
  169.      * @return bool
  170.      */
  171.     public function supportsRememberMe()//: bool
  172.     {
  173.         return false;
  174.     }
  175. }