src/Security/LoginAuthenticator.php line 23

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use App\Entity\Periodo;
  4. use App\Entity\Usuario;
  5. use App\Entity\ViewProfile;
  6. use Doctrine\Persistence\ManagerRegistry;
  7. use Symfony\Component\HttpFoundation\RedirectResponse;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  11. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  12. use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
  13. use Symfony\Component\Security\Core\Security;
  14. use Symfony\Component\Security\Http\Authenticator\AbstractLoginFormAuthenticator;
  15. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\CsrfTokenBadge;
  16. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
  17. use Symfony\Component\Security\Http\Authenticator\Passport\Credentials\PasswordCredentials;
  18. use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
  19. use Symfony\Component\Security\Http\Util\TargetPathTrait;
  20. class LoginAuthenticator extends AbstractLoginFormAuthenticator
  21. {
  22.     use TargetPathTrait;
  23.     public const LOGIN_ROUTE 'app_login';
  24.     private UrlGeneratorInterface $urlGenerator;
  25.     private ManagerRegistry $em;
  26.     public function __construct(UrlGeneratorInterface $urlGeneratorManagerRegistry $managerRegistry)
  27.     {
  28.         $this->urlGenerator $urlGenerator;
  29.         $this->em $managerRegistry;
  30.     }
  31.     public function supports(Request $request): bool
  32.     {
  33.         return self::LOGIN_ROUTE === $request->attributes->get('_route')
  34.             && $request->isMethod('POST');
  35.     }
  36.     public function authenticate(Request $request): Passport
  37.     {
  38.         $correo $request->request->get('correo''');
  39.         $request->getSession()->set(Security::LAST_USERNAME$correo);
  40.         return new Passport(
  41.             new UserBadge($correo, function ($userIdentifier) {
  42.                 $user $this->em->getRepository(Usuario::class)->findOneBy(['correo' => $userIdentifier]);
  43.                 if ($user && $user->getEstatus() == "Pendiente") {
  44.                     throw new CustomUserMessageAuthenticationException('Access request pending evaluation.');
  45.                 }
  46.                 if ($user && $user->getEstatus() == "Rechazado") {
  47.                     throw new CustomUserMessageAuthenticationException('Access request has been rejected.');
  48.                 }
  49.                 if ($user && $user->getEstatus() == "Suspendido") {
  50.                     throw new CustomUserMessageAuthenticationException('Access credentials suspended.');
  51.                 }
  52.                 return $user;
  53.             }),
  54.             new PasswordCredentials($request->request->get('password''')),
  55.             [
  56.                 new CsrfTokenBadge('authenticate'$request->request->get('_csrf_token')),
  57.             ]
  58.         );
  59.     }
  60.     public function onAuthenticationSuccess(Request $requestTokenInterface $tokenstring $firewallName): ?Response
  61.     {
  62.         /** @var Usuario $user */
  63.         $user $token->getUser();
  64.         $rol $user->getRol()->getIdRol();
  65.         $estatusActual $user->getEstatus();
  66.         # Si el usuario tiene rol de "Aceptado" entonces se actualiza a "Activo"
  67.         if ($estatusActual == "Aceptado") {
  68.             $user->setEstatus("Activo");
  69.             $this->em->getManager()->persist($user);
  70.             $this->em->getManager()->flush();
  71.         }
  72.         # Se obtiene el periodo actual
  73.         $periodo $this->em->getRepository(Periodo::class)->findOneBy(['actual' => 1]);
  74.         # Se obtienen los módulos y comportamientos acorde al rol del usuario
  75.         $acciones $this->em->getRepository(ViewProfile::class)->findBy(['idRol' => $rol]);
  76.         $perfil = [];
  77.         $menu = [];
  78.         foreach ($acciones AS $accion) {
  79.             # Construcción de la variable de perfil con la información de módulos y comportamientos por rol
  80.             $perfil[$accion->getIdMod()] = [
  81.                 "idMod" => $accion->getIdMod(),
  82.                 "nombre" => $accion->getModulo(),
  83.                 "submenu" => $accion->getSubmenu(),
  84.                 "idBeh" => $accion->getIdBeh(),
  85.                 "nivel" => $accion->getNivel(),
  86.                 "comportamiento" => $accion->getComportamiento(),
  87.                 "descripcion" => $accion->getDescripcion()
  88.             ];
  89.             # Construcción del menú lateral derecho en la variable de sesión
  90.             if ($accion->getNivel() > 0) {
  91.                 if (empty($accion->getSubmenu())) {
  92.                     $menu[$accion->getOrden()] = [
  93.                         "idMenu" => $accion->getIdMenu(),
  94.                         "menu" => $accion->getModulo(),
  95.                         "icono" => $accion->getIcono(),
  96.                         "ruta" => $accion->getRuta(),
  97.                         "submenu" => false
  98.                     ];
  99.                 } else {
  100.                     if (!array_key_exists($accion->getOrden(), $menu)) {
  101.                         $menu[$accion->getOrden()] = [
  102.                             "idMenu" => $accion->getIdMenu(),
  103.                             "menu" => $accion->getModulo(),
  104.                             "icono" => $accion->getIcono(),
  105.                             "ruta" => "#"
  106.                         ];
  107.                     }
  108.                     $menu[$accion->getOrden()]["submenu"][] = [
  109.                         "idMenu" => $accion->getIdSubmenu(),
  110.                         "menu" => $accion->getSubmenu(),
  111.                         "icono" => "fa-angle-double-up",
  112.                         "ruta" => $accion->getRuta()
  113.                     ];
  114.                 }
  115.             }
  116.         }
  117.         ksort($menu);
  118.         $request->getSession()->set('periodo'$periodo);
  119.         $request->getSession()->set('perfil'$perfil);
  120.         $request->getSession()->set('menu'$menu);
  121.         if ($targetPath $this->getTargetPath($request->getSession(), $firewallName)) {
  122.             return new RedirectResponse($targetPath);
  123.         }
  124.         return new RedirectResponse($this->urlGenerator->generate('homepage'));
  125.     }
  126.     protected function getLoginUrl(Request $request): string
  127.     {
  128.         return $this->urlGenerator->generate(self::LOGIN_ROUTE);
  129.     }
  130. }