src/Controller/SecurityController.php line 34

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\User;
  4. use App\Form\UserAddType;
  5. use App\Form\UserType;
  6. use LogicException;
  7. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\HttpFoundation\JsonResponse;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Component\Routing\Annotation\Route;
  13. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  14. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  15. class SecurityController extends AbstractController
  16. {
  17.     /**
  18.      * @var UserPasswordEncoderInterface
  19.      */
  20.     private $encoder;
  21.     public function __construct(UserPasswordEncoderInterface $encoder) {
  22.         $this->encoder $encoder;
  23.     }
  24.     /**
  25.      * @Route("/login", name="app_login")
  26.      * @param AuthenticationUtils $authenticationUtils
  27.      * @return Response
  28.      */
  29.     public function login(AuthenticationUtils $authenticationUtils): Response
  30.     {
  31.         // if ($this->getUser()) {
  32.         //     return $this->redirectToRoute('target_path');
  33.         // }
  34.         // get the login error if there is one
  35.         $error $authenticationUtils->getLastAuthenticationError();
  36.         // last username entered by the user
  37.         $lastUsername $authenticationUtils->getLastUsername();
  38.         return $this->render('security/login.html.twig', ['last_username' => $lastUsername'error' => $error]);
  39.     }
  40.     /**
  41.      * @Route("/logout", name="app_logout")
  42.      */
  43.     public function logout()
  44.     {
  45.         throw new LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
  46.     }
  47.     /**
  48.      * @Route("/users", name="security.index", methods={"GET"})
  49.      * @return Response
  50.      */
  51.     public function index(): Response
  52.     {
  53.         if (
  54.             !in_array('ROLE_USER_ADMIN'$this->getUser()->getRoles()) &&
  55.             !in_array('ROLE_SUPER_ADMIN'$this->getUser()->getRoles())
  56.         ) {
  57.             $this->addFlash('error''Vous n\'avez pas les droits nécessaire pour visualiser les autres utilisateurs');
  58.             return $this->redirectToRoute('home.index');
  59.         }
  60.         $users $this->getDoctrine()->getRepository(User::class)->findBy(
  61.             ($this->getUser()->getIsDefault() ? [] : ['isDefault' => false]), [
  62.             'firstname' => 'ASC',
  63.             'lastname' =>'ASC'
  64.         ]);
  65.         return $this->render(
  66.             'security/index.html.twig',
  67.             [
  68.                 'controller_name' => 'SecurityController',
  69.                 'users' => $users
  70.             ]
  71.         );
  72.     }
  73.     /**
  74.      * @Route("/users/edit/{id}", name="security.edit", methods={"GET", "POST"})
  75.      * @param User $user
  76.      * @param Request $request
  77.      * @return Response
  78.      */
  79.     public function edit(User $userRequest $request): Response
  80.     {
  81.         if (
  82.             $user->getId() !== $this->getUser()->getId() &&
  83.             !in_array('ROLE_USER_ADMIN'$this->getUser()->getRoles()) &&
  84.             !in_array('ROLE_SUPER_ADMIN'$this->getUser()->getRoles())
  85.         ) {
  86.             $this->addFlash('error''Vous n\'avez pas les droits nécessaire pour visualiser les autres utilisateurs');
  87.             return $this->redirectToRoute('home.index');
  88.         }
  89.         $form $this->createForm(UserType::class, $user, [
  90.             'disabled' => ($user->getIsDefault() && $user->getId() !== $this->getUser()->getId())
  91.         ]);
  92.         $form->handleRequest($request);
  93.         if ($form->isSubmitted() && $form->isValid()) {
  94.             $this->getDoctrine()->getManager()->persist($user);
  95.             $this->getDoctrine()->getManager()->flush();
  96.             $this->addFlash(
  97.                 'success',
  98.                 'Enregistrement effectué avec succès !'
  99.             );
  100.         }
  101.         return $this->render(
  102.             'security/edit.html.twig',
  103.             [
  104.                 'controller_name' => 'SecurityController',
  105.                 'user' => $user,
  106.                 'form' => $form->createView()
  107.             ]
  108.         );
  109.     }
  110.     /**
  111.      * @Route("/users/add", name="security.add", methods={"GET", "POST"})
  112.      * @param Request $request
  113.      * @return Response
  114.      */
  115.     public function add(Request $request): Response
  116.     {
  117.         $user = new User();
  118.         $form $this->createForm(UserAddType::class);
  119.         $form->handleRequest($request);
  120.         if ($form->isSubmitted() && $form->isValid()) {
  121.             $user $form->getData();
  122.             $this->getDoctrine()->getManager()->persist($user);
  123.             $this->getDoctrine()->getManager()->flush();
  124.             $this->addFlash(
  125.                 'success',
  126.                 'Enregistrement effectué avec succès !'
  127.             );
  128.             return $this->redirectToRoute('security.edit', ['id' => $user->getId()]);
  129.         }
  130.         return $this->render(
  131.             'security/edit.html.twig',
  132.             [
  133.                 'controller_name' => 'SecurityController',
  134.                 'user' => $user,
  135.                 'form' => $form->createView(),
  136.                 'inCreation' => true
  137.             ]
  138.         );
  139.     }
  140.     /**
  141.      * @Route("/users/delete/{id}", name="security.delete", methods={"DELETE"})
  142.      * @param User $user
  143.      * @return JsonResponse
  144.      */
  145.     public function delete(User $user): JsonResponse
  146.     {
  147.         $em $this->getDoctrine()->getManager();
  148.         $em->remove($user);
  149.         $em->flush();
  150.         return new JsonResponse([
  151.             'status' => 'ok',
  152.             'message' => 'Utilisateur supprimé avec succès.'
  153.         ]);
  154.     }
  155.     /**
  156.      * @Route("/users/changePassword/{id}", name="security.change.password", methods={"POST"})
  157.      * @param User $user
  158.      * @param Request $request
  159.      * @return JsonResponse
  160.      */
  161.     public function changePassword(User $userRequest $request): JsonResponse
  162.     {
  163.         $data json_decode($request->getContent(), true);
  164.         if (!isset($data['password']) || !isset($data['confirm'])) {
  165.             return new JsonResponse([
  166.                 'status' => 'nok',
  167.                 'message' => 'Le mot de passe doit contenir au moins 8 caractères.'
  168.             ], 500);
  169.         }
  170.         if ($data['password'] != $data['confirm']) {
  171.             return new JsonResponse([
  172.                 'status' => 'nok',
  173.                 'message' => 'Le mot de passe et la confirmation doivent être identique.'
  174.             ], 500);
  175.         }
  176.         if (strlen($data['password']) < 8) {
  177.             return new JsonResponse([
  178.                 'status' => 'nok',
  179.                 'message' => 'Le mot de passe doit contenir au moins 8 caractères.'
  180.             ], 500);
  181.         }
  182.         $user->setPassword($this->encoder->encodePassword($user$data['password']));
  183.         $this->getDoctrine()->getManager()->persist($user);
  184.         $this->getDoctrine()->getManager()->flush();
  185.         return new JsonResponse([
  186.             'status' => 'ok',
  187.             'message' => 'Changement de mot de passe effectué.'
  188.         ]);
  189.     }
  190. }