src/Security/UserProvider.php line 39

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use App\DTOs\UserMe;
  4. use App\Entity\Monolith\User;
  5. use App\Helper\LoginHelper;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Exception;
  8. use Psr\Log\LoggerInterface;
  9. use Symfony\Component\HttpFoundation\RequestStack;
  10. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  11. use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
  12. use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
  13. use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
  14. use Symfony\Component\Security\Core\User\PasswordUpgraderInterface;
  15. use Symfony\Component\Security\Core\User\UserInterface;
  16. use Symfony\Component\Security\Core\User\UserProviderInterface;
  17. class UserProvider implements UserProviderInterfacePasswordUpgraderInterface
  18. {
  19.     public function __construct(
  20.         private RequestStack $requestStack,
  21.         private EntityManagerInterface $entityManager,
  22.         private LoggerInterface $logger)
  23.     {
  24.     }
  25.     public function loadUserByUsername(string $username): UserInterface
  26.     {
  27.         throw new Exception('Never load by username');
  28.     }
  29.     public function loadUserByIdentifier(string $identifier): UserInterface
  30.     {
  31.         $headers $this->requestStack->getCurrentRequest()->headers;
  32.         $kindergarten $headers->get('X-KINDERGARTEN-ID');
  33.         $userMe LoginHelper::fetchUser(
  34.             $this->entityManager,
  35.             'email',
  36.             $identifier,
  37.             $headers->get('user-type'),
  38.             $kindergarten
  39.         );
  40.         if (null === $userMe) {
  41.             throw new UnauthorizedHttpException('''Invalid credentials.');
  42.         }
  43.         if (!empty($kindergarten)) {
  44.             if (!in_array($kindergarten$userMe->getKindergartenIds())) {
  45.                 $this->logger->critical('No access: ' $identifier ' -> ' $kindergarten);
  46.                 throw new AccessDeniedHttpException('No access to specified kindergarten');
  47.             }
  48.             $userMe->setKindergartenIdHeader($kindergarten);
  49.         }
  50.         $userType $headers->get('USER-TYPE');
  51.         if ($userType) {
  52.             if (!in_array($userTypeUser::APP_TYPES)) {
  53.                 throw new AccessDeniedHttpException('Wrong USER-TYPE header');
  54.             }
  55.             $userMe->setUserTypeHeader($userType);
  56.         }
  57.         $childId $headers->get('X-CHILD-ID');
  58.         if (User::APP_TYPE_PARENT == $userType && empty($childId)) {
  59. //            probably we need it, but we have to solve this exception when parent requests /me after login
  60. //            throw new AccessDeniedHttpException('X-CHILD-ID header missed');
  61.         }
  62.         if ($childId && !in_array($childId$userMe->getChildrenIds())) {
  63.             throw new AccessDeniedHttpException('No access to specified child');
  64.         }
  65.         return $userMe
  66.             ->setChildIdHeader($childId)
  67.         ;
  68.     }
  69.     public function refreshUser(UserInterface $user): UserInterface
  70.     {
  71.         if (!$user instanceof UserMe) {
  72.             throw new UnsupportedUserException(sprintf('Invalid user class "%s".'get_class($user)));
  73.         }
  74.         return $user;
  75.     }
  76.     public function supportsClass(string $class): bool
  77.     {
  78.         return UserMe::class === $class || is_subclass_of($classUserMe::class);
  79.     }
  80.     public function upgradePassword(PasswordAuthenticatedUserInterface $userstring $newHashedPassword): void
  81.     {
  82.         // TODO: Implement upgradePassword() method.
  83.     }
  84. }