<?php
namespace App\Controller;
use App\Entity\User;
use App\Form\UserAddType;
use App\Form\UserType;
use LogicException;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class SecurityController extends AbstractController
{
/**
* @var UserPasswordEncoderInterface
*/
private $encoder;
public function __construct(UserPasswordEncoderInterface $encoder) {
$this->encoder = $encoder;
}
/**
* @Route("/login", name="app_login")
* @param AuthenticationUtils $authenticationUtils
* @return Response
*/
public function login(AuthenticationUtils $authenticationUtils): Response
{
// if ($this->getUser()) {
// return $this->redirectToRoute('target_path');
// }
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('security/login.html.twig', ['last_username' => $lastUsername, 'error' => $error]);
}
/**
* @Route("/logout", name="app_logout")
*/
public function logout()
{
throw new LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
}
/**
* @Route("/users", name="security.index", methods={"GET"})
* @return Response
*/
public function index(): Response
{
if (
!in_array('ROLE_USER_ADMIN', $this->getUser()->getRoles()) &&
!in_array('ROLE_SUPER_ADMIN', $this->getUser()->getRoles())
) {
$this->addFlash('error', 'Vous n\'avez pas les droits nécessaire pour visualiser les autres utilisateurs');
return $this->redirectToRoute('home.index');
}
$users = $this->getDoctrine()->getRepository(User::class)->findBy(
($this->getUser()->getIsDefault() ? [] : ['isDefault' => false]), [
'firstname' => 'ASC',
'lastname' =>'ASC'
]);
return $this->render(
'security/index.html.twig',
[
'controller_name' => 'SecurityController',
'users' => $users
]
);
}
/**
* @Route("/users/edit/{id}", name="security.edit", methods={"GET", "POST"})
* @param User $user
* @param Request $request
* @return Response
*/
public function edit(User $user, Request $request): Response
{
if (
$user->getId() !== $this->getUser()->getId() &&
!in_array('ROLE_USER_ADMIN', $this->getUser()->getRoles()) &&
!in_array('ROLE_SUPER_ADMIN', $this->getUser()->getRoles())
) {
$this->addFlash('error', 'Vous n\'avez pas les droits nécessaire pour visualiser les autres utilisateurs');
return $this->redirectToRoute('home.index');
}
$form = $this->createForm(UserType::class, $user, [
'disabled' => ($user->getIsDefault() && $user->getId() !== $this->getUser()->getId())
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->getDoctrine()->getManager()->persist($user);
$this->getDoctrine()->getManager()->flush();
$this->addFlash(
'success',
'Enregistrement effectué avec succès !'
);
}
return $this->render(
'security/edit.html.twig',
[
'controller_name' => 'SecurityController',
'user' => $user,
'form' => $form->createView()
]
);
}
/**
* @Route("/users/add", name="security.add", methods={"GET", "POST"})
* @param Request $request
* @return Response
*/
public function add(Request $request): Response
{
$user = new User();
$form = $this->createForm(UserAddType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user = $form->getData();
$this->getDoctrine()->getManager()->persist($user);
$this->getDoctrine()->getManager()->flush();
$this->addFlash(
'success',
'Enregistrement effectué avec succès !'
);
return $this->redirectToRoute('security.edit', ['id' => $user->getId()]);
}
return $this->render(
'security/edit.html.twig',
[
'controller_name' => 'SecurityController',
'user' => $user,
'form' => $form->createView(),
'inCreation' => true
]
);
}
/**
* @Route("/users/delete/{id}", name="security.delete", methods={"DELETE"})
* @param User $user
* @return JsonResponse
*/
public function delete(User $user): JsonResponse
{
$em = $this->getDoctrine()->getManager();
$em->remove($user);
$em->flush();
return new JsonResponse([
'status' => 'ok',
'message' => 'Utilisateur supprimé avec succès.'
]);
}
/**
* @Route("/users/changePassword/{id}", name="security.change.password", methods={"POST"})
* @param User $user
* @param Request $request
* @return JsonResponse
*/
public function changePassword(User $user, Request $request): JsonResponse
{
$data = json_decode($request->getContent(), true);
if (!isset($data['password']) || !isset($data['confirm'])) {
return new JsonResponse([
'status' => 'nok',
'message' => 'Le mot de passe doit contenir au moins 8 caractères.'
], 500);
}
if ($data['password'] != $data['confirm']) {
return new JsonResponse([
'status' => 'nok',
'message' => 'Le mot de passe et la confirmation doivent être identique.'
], 500);
}
if (strlen($data['password']) < 8) {
return new JsonResponse([
'status' => 'nok',
'message' => 'Le mot de passe doit contenir au moins 8 caractères.'
], 500);
}
$user->setPassword($this->encoder->encodePassword($user, $data['password']));
$this->getDoctrine()->getManager()->persist($user);
$this->getDoctrine()->getManager()->flush();
return new JsonResponse([
'status' => 'ok',
'message' => 'Changement de mot de passe effectué.'
]);
}
}