src/Listener/AccessControlListener.php line 31

Open in your IDE?
  1. <?php
  2. namespace App\Listener;
  3. use App\Entity\AclSetting;
  4. use App\Entity\User;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Symfony\Component\HttpKernel\Event\RequestEvent;
  7. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  8. use Symfony\Component\Security\Core\Security;
  9. class AccessControlListener
  10. {
  11. private Security $security;
  12. private EntityManagerInterface $em;
  13. public function __construct(
  14. Security $security,
  15. EntityManagerInterface $em
  16. )
  17. {
  18. $this->security = $security;
  19. $this->em = $em;
  20. }
  21. /**
  22. * @param RequestEvent $event
  23. *
  24. * @return void
  25. */
  26. public function onKernelRequest( RequestEvent $event )
  27. {
  28. $request = $event->getRequest();
  29. $route = $request->attributes->get( '_route' );
  30. if ( $route === NULL ) {
  31. return;
  32. }
  33. // Récupérer l'utilisateur connecté (s'il y en a un)
  34. $user = $this->security->getUser();
  35. if ( $user instanceof User ) {
  36. $allowed = $this->checkAccessControl( $user, $route );
  37. if ( !$allowed ) {
  38. // Générer une réponse d'erreur 403 (Accès refusé)
  39. throw new AccessDeniedHttpException();
  40. }
  41. }
  42. }
  43. /**
  44. * @param User $user
  45. * @param string $route
  46. *
  47. * @return bool
  48. */
  49. private function checkAccessControl( User $user, string $route ): bool
  50. {
  51. if ( $route === 'dev_update_bdd' ) {
  52. return TRUE;
  53. }
  54. return $this->em->getRepository( AclSetting::class )->isUserGrantedByRoute( $user, $route );
  55. }
  56. }