src/Controller/SecurityController.php line 51

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Painel\Passwordless;
  4. use App\Entity\Painel\Usuario;
  5. use App\Entity\Painel\UsuarioAcesso;
  6. use App\Helper\StringHelper;
  7. use App\Repository\Cliente\Acesso\UsuarioAcessoRepository;
  8. use App\Repository\Painel\ClienteRepository;
  9. use App\Repository\Painel\PasswordlessRepository;
  10. use App\Repository\Painel\UsuarioRepository;
  11. use App\Service\Email;
  12. use DateTime;
  13. use DateTimeZone;
  14. use Doctrine\Persistence\ManagerRegistry;
  15. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. use Symfony\Component\HttpFoundation\Request;
  19. use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
  20. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  21. class SecurityController extends AbstractController
  22. {
  23.     private $email;
  24.     private $usuarioAcesso;
  25.     private $managerRegistry;
  26.     private $usuarioRepository;
  27.     private $clienteRepository;
  28.     private $passwordlessRepository;
  29.     public function __construct(
  30.         Email $email,
  31.         ManagerRegistry $managerRegistry,
  32.         UsuarioRepository $usuarioRepository,
  33.         ClienteRepository $clienteRepository,
  34.         PasswordlessRepository $passwordlessRepository,
  35.         UsuarioAcessoRepository $usuarioAcessoRepository
  36.     ) {
  37.         $this->email $email;
  38.         $this->managerRegistry $managerRegistry;
  39.         $this->usuarioRepository $usuarioRepository;
  40.         $this->clienteRepository $clienteRepository;
  41.         $this->usuarioAcesso $usuarioAcessoRepository;
  42.         $this->passwordlessRepository $passwordlessRepository;
  43.     }
  44.     /**
  45.      * @Route("/login", name="app_login")
  46.      */
  47.     public function login(Request $requestAuthenticationUtils $authenticationUtils): Response
  48.     {
  49.         // get the login error if there is one
  50.         $error $authenticationUtils->getLastAuthenticationError();
  51.         // last username entered by the user
  52.         $lastUsername $authenticationUtils->getLastUsername();
  53.         // ip
  54.         $ip $this->container->get('request_stack')->getCurrentRequest()->getClientIp();
  55.         // default
  56.         $testeForce = [
  57.             'status' => NULL
  58.            ,'tempo' => NULL
  59.            ,'segundos' => NULL
  60.         ];
  61.         if ( $error ) {
  62.             $em $this->managerRegistry->getManager('default');
  63.             $usuario = new UsuarioAcesso();
  64.             $usuario->setLogin(StringHelper::limpa($lastUsernametrue));
  65.             $usuario->setIp($ip);
  66.             $usuario->setErrorMsg($error->getMessage());
  67.             $em->persist($usuario);
  68.             $em->flush();
  69.             $em->clear();
  70.             $testeForce $this->usuarioAcesso->findLastMinutes($lastUsername$ip);
  71.         }
  72.         return $this->render('security/login.html.twig', [
  73.              'page' => 'page-login'
  74.             ,'last_username' => $lastUsername
  75.             ,'error' => $error
  76.             ,'testa_force' => $testeForce
  77.             ,'step' => $request->request->get('step''email')
  78.         ]);
  79.     }
  80.     /**
  81.      * @Route("/login/check", name="app_login_check", methods={"POST"})
  82.      */
  83.     public function check(Request $request)
  84.     {
  85.         // get the login link query parameters
  86.         $email $request->request->get('email');
  87.         $user null;
  88.         if ( $email ) {
  89.             $user $this->usuarioRepository->findOneBy(['email' => $email]);
  90.         }
  91.         $testeForce = [
  92.             'status' => NULL
  93.            ,'tempo' => NULL
  94.            ,'segundos' => NULL
  95.         ];
  96.         $params = [
  97.             'page' => 'page-login'
  98.             ,'last_username' => $lastUsername ?? null
  99.             ,'error' => $error ?? null
  100.             ,'testa_force' => $testeForce
  101.         ];
  102.         if ($user instanceof Usuario) {
  103.             if ( !$user->isPasswordlessEnabled() ) {
  104.                 return $this->render('security/login.html.twig', [
  105.                     'step' => 'senha',
  106.                     'email' => $request->request->get('email')
  107.                 ] + $params);
  108.             } else {
  109.                 $token StringHelper::geraSenha(6$maiusculas true$minusculas true$numeros true);
  110.                 $data_atual = new DateTime('now', new DateTimeZone('Etc/GMT+3'));
  111.                 $passwordlessObject $this->passwordlessRepository->findOneBy(['id_usuario' => $user->getId_usuario()], ['data_criacao' => 'DESC']);
  112.                 if(!is_null($passwordlessObject)){
  113.                     $passwordlessObject->setAtivo(false);
  114.                     $this->passwordlessRepository->add($passwordlessObjecttrue);
  115.                 }
  116.                 $data_limite = clone $data_atual;
  117.                 $passwordlessObject = new Passwordless();
  118.                 $passwordlessObject->setIdUsuario($user->getId_usuario())
  119.                         ->setToken($token)
  120.                         ->setDataCriacao($data_atual)
  121.                         ->setDataLimite($data_limite->modify('+10 minutes'))
  122.                         ->setAtivo(true);
  123.                 //Envio do token por email
  124.                 $paramsEmail = [
  125.                     'nome' => $user->getNome(),
  126.                     'projeto' => '2iM Analytics',
  127.                     'login' => $user->getLogin(),
  128.                     'to' => $user->getLogin(),
  129.                     'token' => $token,
  130.                     'subject' => "Seu acesso ao 2iM Analytics - {$data_atual->format('d/m/Y H:i:s')}",
  131.                     'template' => 'email/login-token.html.twig',
  132.                 ];
  133.                 $response $this->email->enviar($paramsEmail);
  134.                 if ($response['status'] <= 0) {
  135.                     $this->addFlash(
  136.                         "error",
  137.                         "Erro ao enviar token de acesso!"
  138.                     );
  139.                     return $this->redirectToRoute("app_login");
  140.                 }
  141.                 $this->passwordlessRepository->add($passwordlessObjecttrue);
  142.                 $this->addFlash(
  143.                     "success",
  144.                     "Se os dados informados estiverem corretos, o token será enviado para o e-mail cadastrado! Caso não encontre-o, verifique a caixa de spam."
  145.                 );
  146.                 return $this->render('security/login.html.twig', [
  147.                     'step' => 'token'
  148.                 ] + $params);
  149.             }
  150.         }
  151.         return $this->render('security/login.html.twig', [
  152.             'step' => 'senha',
  153.             'email' => $request->request->get('email')
  154.         ] + $params);
  155.     }
  156.     /**
  157.      * @Route("/logout", name="app_logout")
  158.      */
  159.     public function logout()
  160.     {
  161.         throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
  162.     }
  163.     
  164.     /**
  165.     * @Route("/2fa", name="2fa_login")
  166.     */
  167.     public function login_2fa(Request $request)
  168.     {
  169.         $user $this->getUser();
  170.         
  171.         return $this->render('security/2fa_login.html.twig',[
  172.             'page' => 'page-clientes',
  173.             'nomeUser' => $user->getNome()
  174.         ]);
  175.     }
  176.     /**
  177.     * @Route("/modal-codigo", name="modal_codigo")
  178.     */
  179.     public function modal_2fa()
  180.     {
  181.         $user $this->getUser();
  182.         return $this->render('security/modal-codigo.html.twig',[
  183.             'nomeUser' => $user->getNome(),
  184.             'loginUser' => $user->getLogin()
  185.         ]);
  186.     }
  187. }