src/Controller/Auth/SecurityController.php line 36

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Auth;
  3. use App\Entity\User;
  4. use App\Form\UserType;
  5. use App\Repository\RoleRepository;
  6. use App\Repository\UserRepository;
  7. use App\Form\UserChangePasswordType;
  8. use App\Form\UserWithoutPasswordType;
  9. use App\Message\MessageAlert;
  10. use Doctrine\Persistence\ManagerRegistry;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. use Doctrine\Common\Collections\ArrayCollection;
  15. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  16. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  17. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  18. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  19. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  20. #[Route('/security')]
  21. class SecurityController extends AbstractController
  22. {
  23.     public function __construct(
  24.         public UserPasswordHasherInterface $passwordHasher,
  25.         public UserRepository $userRepository,
  26.         public RoleRepository $roleRepository,
  27.         public ManagerRegistry $doctrine
  28.     ) {
  29.     }
  30.     #[Route(path'/login'name'app_login')]
  31.     public function login(AuthenticationUtils $authenticationUtils): Response
  32.     {
  33.         // if ($this->getUser()) {
  34.         //     return $this->redirectToRoute('target_path');
  35.         // }
  36.         // get the login error if there is one
  37.         $error $authenticationUtils->getLastAuthenticationError();
  38.         // last username entered by the user
  39.         $lastUsername $authenticationUtils->getLastUsername();
  40.         return $this->render('security/login.html.twig', ['last_username' => $lastUsername'error' => $error]);
  41.     }
  42.     #[Route(path'/logout'name'app_logout')]
  43.     public function logout(): void
  44.     {
  45.         throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
  46.     }
  47.     #[Route('/users'name'app_user_index')]
  48.     #[Security("is_granted('ROLE_USER') or is_granted('ROLE_PDV') or is_granted('ROLE_SUP')")]
  49.     public function index(): Response
  50.     {
  51.         // dd($this->userRepository->findAll());
  52.         return $this->render('security/index.html.twig', [
  53.             'users' => $this->userRepository->findAll(),
  54.         ]);
  55.     }
  56.     #[IsGranted('ROLE_SUP')]
  57.     #[Route('/register'name'app_register'methods: ['GET''POST'])]
  58.     public function register(Request $request): Response
  59.     {
  60.         $user = new User();
  61.         $form $this->createForm(UserType::class, $user);
  62.         $form->handleRequest($request);
  63.         if ($form->isSubmitted() && $form->isValid()) {
  64.             //Hash password
  65.             $plainTextPasswors $user->getPassword();
  66.             $hashedPassword $this->passwordHasher->hashPassword(
  67.                 $user,
  68.                 $plainTextPasswors
  69.             );
  70.             $user->setUsername($user->getFirstName() . ' ' $user->getLastName());
  71.             $user->setPassword($hashedPassword);
  72.             $manager $this->doctrine->getManager();
  73.             foreach ($user->getUserRoles() as $role) {
  74.                 $user->addUserRole($role);
  75.                 $role->addUser($user);
  76.                 $manager->persist($role);
  77.             }
  78.             $manager->flush();
  79.             $this->userRepository->save($usertrue);
  80.             $this->addFlash(
  81.                 MessageAlert::$success['type'],
  82.                 MessageAlert::$success['title'] . '' .
  83.                     MessageAlert::$success['message']
  84.             );
  85.             return $this->redirectToRoute('app_user_index', [], Response::HTTP_SEE_OTHER);
  86.         }
  87.         return $this->renderForm('security/registerAdmin.html.twig', [
  88.             'user' => $user,
  89.             'form' => $form,
  90.         ]);
  91.     }
  92.     #[IsGranted('ROLE_SUP')]
  93.     #[Route('/register_without_password'name'app_user_register_wPass'methods: ['GET''POST'])]
  94.     public function registerWithoutPassword(Request $request): Response
  95.     {
  96.         $user = new User();
  97.         $form $this->createForm(UserWithoutPasswordType::class, $user);
  98.         $form->handleRequest($request);
  99.         if ($form->isSubmitted() && $form->isValid()) {
  100.             $plainTextPassword "password";
  101.             $hashedPassword $this->passwordHasher->hashPassword($user$plainTextPassword);
  102.             $user->setPassword($hashedPassword);
  103.             $user->setUsername($user->getFirstName() . ' ' $user->getLastName());
  104.             $manager $this->doctrine->getManager();
  105.             foreach ($user->getUserRoles() as $role) {
  106.                 $user->addUserRole($role);
  107.                 $role->addUser($user);
  108.                 $manager->persist($role);
  109.             }
  110.             $manager->flush();
  111.             $this->userRepository->save($usertrue);
  112.             $this->addFlash(
  113.                 MessageAlert::$success['type'],
  114.                 MessageAlert::$success['title'] . '' .
  115.                     MessageAlert::$success['message']
  116.             );
  117.             return $this->redirectToRoute('app_user_index', [], Response::HTTP_SEE_OTHER);
  118.         }
  119.         return $this->renderForm('security/registerAdmin.html.twig', [
  120.             'user' => $user,
  121.             'form' => $form
  122.         ]);
  123.     }
  124.     #[Route('/{id}'name'app_user_show'methods: ['GET'])]
  125.     public function show(User $user): Response
  126.     {
  127.         return $this->render('security/show.html.twig', [
  128.             'user' => $user,
  129.         ]);
  130.     }
  131.     #[IsGranted('ROLE_SUP')]
  132.     #[Route('/{id}/edit/'name'app_user_edit'methods: ['GET''POST'])]
  133.     public function edit(Request $requestUser $user): Response
  134.     {
  135.         $form $this->createForm(UserType::class, $user);
  136.         $form->handleRequest($request);
  137.         $originalRoles = new ArrayCollection();
  138.         $roles $this->roleRepository->getRoleByUserId($user->getId());
  139.         foreach ($roles as $role) {
  140.             $originalRoles->add($role);
  141.         }
  142.         if ($form->isSubmitted() && $form->isValid()) {
  143.             $user->setUsername($user->getFirstName() . ' ' $user->getLastName());
  144.             $plainTextPasswors $user->getPassword();
  145.             $hashedPassword $this->passwordHasher->hashPassword(
  146.                 $user,
  147.                 $plainTextPasswors
  148.             );
  149.             $user->setPassword($hashedPassword);
  150.             $manager $this->doctrine->getManager();
  151.             foreach ($originalRoles as $role) {
  152.                 if (false === $user->getUserRoles()->contains($role)) {
  153.                     $role->removeUser($user);
  154.                     $user->removeUserRole($role);
  155.                 } else {
  156.                     foreach ($user->getUserRoles() as $role2) {
  157.                         $user->addUserRole($role2);
  158.                         $role2->addUser($user);
  159.                         $manager->persist($role2);
  160.                     }
  161.                 }
  162.             }
  163.             foreach ($user->getUserRoles() as $role) {
  164.                 $role->addUser($user);
  165.                 $manager->persist($role);
  166.             }
  167.             $this->addFlash(
  168.                 MessageAlert::$success['type'],
  169.                 MessageAlert::$success['title'] . '' .
  170.                     MessageAlert::$success['message']
  171.             );
  172.             $manager->flush();
  173.             $this->userRepository->save($usertrue);
  174.             return $this->redirectToRoute('app_user_index', [], Response::HTTP_SEE_OTHER);
  175.         }
  176.         return $this->renderForm('security/edit.html.twig', [
  177.             'form' => $form,
  178.             'user' => $user
  179.         ]);
  180.     }
  181.     #[Security('is_granted("ROLE_USR") or is_granted("ROLE_PDV") or is_granted("ROLE_USR")')]
  182.     #[Route("/{id}/change_password""app_user_ch_password"methods: ['GET''POST'])]
  183.     public function changePassword(Request $requestUser $user): Response
  184.     {
  185.         $form $this->createForm(UserChangePasswordType::class, $user);
  186.         $form->handleRequest($request);
  187.         if ($form->isSubmitted() && $form->isValid()) {
  188.             $holdPassword $request->request->all()['user_change_password']['password'];
  189.             $newPassword $request->request->all()['user_change_password']['newPassword']['first'];
  190.             if ($this->passwordHasher->isPasswordValid($user$holdPassword) === true) {
  191.                 $hashedPassword $this->passwordHasher->hashPassword($user$newPassword);
  192.                 $user->setPassword($hashedPassword);
  193.                 $this->userRepository->save($usertrue);
  194.                 return $this->redirectToRoute('app_logout', [], Response::HTTP_SEE_OTHER);
  195.             }
  196.         }
  197.         return $this->renderForm('security/changePassword.html.twig', [
  198.             'user' => $user,
  199.             'form' => $form,
  200.         ]);
  201.     }
  202.     #[IsGranted('ROLE_SUP')]
  203.     #[Route('/{id}'name'app_user_remove'methods: ['POST'])]
  204.     public function delete(Request $requestUser $user): Response
  205.     {
  206.         if ($this->isCsrfTokenValid('delete'$user->getId(), $request->request->get('_token'))) {
  207.             $this->userRepository->remove($usertrue);
  208.         }
  209.         return $this->redirectToRoute('app_user_index', [], Response::HTTP_SEE_OTHER);
  210.     }
  211. }