<?php
namespace App\Controller\Auth;
use App\Entity\User;
use App\Form\UserType;
use App\Repository\RoleRepository;
use App\Repository\UserRepository;
use App\Form\UserChangePasswordType;
use App\Form\UserWithoutPasswordType;
use App\Message\MessageAlert;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\Common\Collections\ArrayCollection;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
#[Route('/security')]
class SecurityController extends AbstractController
{
public function __construct(
public UserPasswordHasherInterface $passwordHasher,
public UserRepository $userRepository,
public RoleRepository $roleRepository,
public ManagerRegistry $doctrine
) {
}
#[Route(path: '/login', name: 'app_login')]
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(path: '/logout', name: 'app_logout')]
public function logout(): void
{
throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
}
#[Route('/users', name: 'app_user_index')]
#[Security("is_granted('ROLE_USER') or is_granted('ROLE_PDV') or is_granted('ROLE_SUP')")]
public function index(): Response
{
// dd($this->userRepository->findAll());
return $this->render('security/index.html.twig', [
'users' => $this->userRepository->findAll(),
]);
}
#[IsGranted('ROLE_SUP')]
#[Route('/register', name: 'app_register', methods: ['GET', 'POST'])]
public function register(Request $request): Response
{
$user = new User();
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
//Hash password
$plainTextPasswors = $user->getPassword();
$hashedPassword = $this->passwordHasher->hashPassword(
$user,
$plainTextPasswors
);
$user->setUsername($user->getFirstName() . ' ' . $user->getLastName());
$user->setPassword($hashedPassword);
$manager = $this->doctrine->getManager();
foreach ($user->getUserRoles() as $role) {
$user->addUserRole($role);
$role->addUser($user);
$manager->persist($role);
}
$manager->flush();
$this->userRepository->save($user, true);
$this->addFlash(
MessageAlert::$success['type'],
MessageAlert::$success['title'] . '' .
MessageAlert::$success['message']
);
return $this->redirectToRoute('app_user_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('security/registerAdmin.html.twig', [
'user' => $user,
'form' => $form,
]);
}
#[IsGranted('ROLE_SUP')]
#[Route('/register_without_password', name: 'app_user_register_wPass', methods: ['GET', 'POST'])]
public function registerWithoutPassword(Request $request): Response
{
$user = new User();
$form = $this->createForm(UserWithoutPasswordType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$plainTextPassword = "password";
$hashedPassword = $this->passwordHasher->hashPassword($user, $plainTextPassword);
$user->setPassword($hashedPassword);
$user->setUsername($user->getFirstName() . ' ' . $user->getLastName());
$manager = $this->doctrine->getManager();
foreach ($user->getUserRoles() as $role) {
$user->addUserRole($role);
$role->addUser($user);
$manager->persist($role);
}
$manager->flush();
$this->userRepository->save($user, true);
$this->addFlash(
MessageAlert::$success['type'],
MessageAlert::$success['title'] . '' .
MessageAlert::$success['message']
);
return $this->redirectToRoute('app_user_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('security/registerAdmin.html.twig', [
'user' => $user,
'form' => $form
]);
}
#[Route('/{id}', name: 'app_user_show', methods: ['GET'])]
public function show(User $user): Response
{
return $this->render('security/show.html.twig', [
'user' => $user,
]);
}
#[IsGranted('ROLE_SUP')]
#[Route('/{id}/edit/', name: 'app_user_edit', methods: ['GET', 'POST'])]
public function edit(Request $request, User $user): Response
{
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
$originalRoles = new ArrayCollection();
$roles = $this->roleRepository->getRoleByUserId($user->getId());
foreach ($roles as $role) {
$originalRoles->add($role);
}
if ($form->isSubmitted() && $form->isValid()) {
$user->setUsername($user->getFirstName() . ' ' . $user->getLastName());
$plainTextPasswors = $user->getPassword();
$hashedPassword = $this->passwordHasher->hashPassword(
$user,
$plainTextPasswors
);
$user->setPassword($hashedPassword);
$manager = $this->doctrine->getManager();
foreach ($originalRoles as $role) {
if (false === $user->getUserRoles()->contains($role)) {
$role->removeUser($user);
$user->removeUserRole($role);
} else {
foreach ($user->getUserRoles() as $role2) {
$user->addUserRole($role2);
$role2->addUser($user);
$manager->persist($role2);
}
}
}
foreach ($user->getUserRoles() as $role) {
$role->addUser($user);
$manager->persist($role);
}
$this->addFlash(
MessageAlert::$success['type'],
MessageAlert::$success['title'] . '' .
MessageAlert::$success['message']
);
$manager->flush();
$this->userRepository->save($user, true);
return $this->redirectToRoute('app_user_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('security/edit.html.twig', [
'form' => $form,
'user' => $user
]);
}
#[Security('is_granted("ROLE_USR") or is_granted("ROLE_PDV") or is_granted("ROLE_USR")')]
#[Route("/{id}/change_password", "app_user_ch_password", methods: ['GET', 'POST'])]
public function changePassword(Request $request, User $user): Response
{
$form = $this->createForm(UserChangePasswordType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$holdPassword = $request->request->all()['user_change_password']['password'];
$newPassword = $request->request->all()['user_change_password']['newPassword']['first'];
if ($this->passwordHasher->isPasswordValid($user, $holdPassword) === true) {
$hashedPassword = $this->passwordHasher->hashPassword($user, $newPassword);
$user->setPassword($hashedPassword);
$this->userRepository->save($user, true);
return $this->redirectToRoute('app_logout', [], Response::HTTP_SEE_OTHER);
}
}
return $this->renderForm('security/changePassword.html.twig', [
'user' => $user,
'form' => $form,
]);
}
#[IsGranted('ROLE_SUP')]
#[Route('/{id}', name: 'app_user_remove', methods: ['POST'])]
public function delete(Request $request, User $user): Response
{
if ($this->isCsrfTokenValid('delete', $user->getId(), $request->request->get('_token'))) {
$this->userRepository->remove($user, true);
}
return $this->redirectToRoute('app_user_index', [], Response::HTTP_SEE_OTHER);
}
}