src/EventSubscriber/PasswordChangeSubscriber.php line 39

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\User;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\HttpFoundation\RedirectResponse;
  6. use Symfony\Component\HttpKernel\Event\RequestEvent;
  7. use Symfony\Component\HttpKernel\KernelEvents;
  8. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  9. use Symfony\Component\Security\Core\Security;
  10. class PasswordChangeSubscriber implements EventSubscriberInterface
  11. {
  12.     private $security;
  13.     private $urlGenerator;
  14.     public function __construct(Security $securityUrlGeneratorInterface $urlGenerator)
  15.     {
  16.         $this->security $security;
  17.         $this->urlGenerator $urlGenerator;
  18.     }
  19.     public static function getSubscribedEvents(): array
  20.     {
  21.         return [
  22.             KernelEvents::REQUEST => [
  23.                 ['forcePasswordChange'0],
  24.             ],
  25.         ];
  26.     }
  27.     public function forcePasswordChange(RequestEvent $event): void
  28.     {
  29.         $request $event->getRequest();
  30.         $_route $request->attributes->get('_route');
  31.         // only deal with the main request, disregard subrequests
  32.         if (!$event->isMasterRequest()) {
  33.             return;
  34.         }
  35.         $user $this->security->getUser();
  36.         // if you do not have a valid user, it means it's not an authenticated request, so it's not our concern
  37.         if (!$user instanceof User) {
  38.             return;
  39.         }
  40.         $request $event->getRequest();
  41.         // if it's not their first login, and they do not need to change their password, move on
  42.         // but allow dsgvo, impressum and cookie page
  43.         if (
  44.             !$user->getForcepasswordchange()
  45.             || 'pages_dsgvo' == $request->get('_route')
  46.             || 'pages_impressum' == $request->get('_route')
  47.             || 'pages_cookie' == $request->get('_route')
  48.             || 'install_chose_action' == $request->get('_route')
  49.             || 'qrtickets' == $request->get('_route')
  50.             || 'ticket_install_edit' == $request->get('_route')
  51.             || 'install_begehung' == $request->get('_route')
  52.             || 'elevator_detail_live_qr' == $request->get('_route')
  53.             || 'set_elevator_state_qr' == $request->get('_route')
  54.             || 'set_elevator_state_qr' == $request->get('_route')
  55.             || 'update_timer' == $request->get('_route')
  56.             || 'elevator_acquisition' == $request->get('_route')
  57.             || 'elevator_acquisition_detail' == $request->get('_route')
  58.             || 'elevator_acquisition_finished' == $request->get('_route')
  59.             || 'elevator_acquisition_pdf' == $request->get('_route')
  60.             || 'elevator_acquisition_upload_file' == $request->get('_route')
  61.         ) {
  62.             return;
  63.         }
  64.         // if we get here, it means we need to redirect them to the password change view.
  65.         $redirectTo $this->urlGenerator->generate('firstLogin');
  66.         if (
  67.             $event->getRequest()->getRequestUri() != $redirectTo
  68.             && 'install_chose_action' != $_route
  69.         ) {
  70.             $event->setResponse(new RedirectResponse($redirectTo));
  71.         }
  72.     }
  73. }