boosterV
boosterV

Reputation: 119

Symfony: check user authorization inside event listener

I'm new to Symfony (Currently using Symfony 3.2) and I'm learning how to create event listener for run my random functions before every controllers. My goal is to check by isGranted() function that user is logged or not. Take a look at my code

services.yml

> parameters:
> #    parameter_name: value
> 
> services:
>     app.form_login_authenticator:
>         class: AppBundle\Security\FormLoginAuthenticator
>         arguments: ["@router", "@security.password_encoder"]
>     app.init.action_listener:
>         class: AppBundle\EventListener\InitListener
>         tags:
>             - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }

InitListener

> <?php namespace AppBundle\EventListener;
> 
> use AppBundle\Controller\InitController; use
> Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; use
> Symfony\Component\HttpKernel\Event\FilterControllerEvent; use
> Symfony\Component\HttpFoundation\Session\Session; 
>
>  class InitListener {
>     
>     public function onKernelController(FilterControllerEvent $event)
>     {
>         $controller = $event->getController(); 
> 
>        
> 
>         //if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY'))
>         //{
>         // do somehting
>         //}else{
>         // do somehting
>         //}
>         if ($controller[0] instanceof InitController) {
>           
>         }
>         if (!is_array($controller)) {
>             return;
>         }
>    
>    
>     }
>  }

What should I do to use isGranted() function inside my InitListener?

Upvotes: 2

Views: 5553

Answers (1)

E.K.
E.K.

Reputation: 1055

Obviously you should pass security.authorization_checker into your listener.

First in config

 app.init.action_listener:
     class: AppBundle\EventListener\InitListener
     arguments: ["@security.authorization_checker"]
     tags:
         - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }

and then in the code

 <?php namespace AppBundle\EventListener;

 use AppBundle\Controller\InitController; 
 use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; 
 use Symfony\Component\HttpKernel\Event\FilterControllerEvent; 
 use Symfony\Component\HttpFoundation\Session\Session; 
 use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface

 class InitListener {

     protected $authorizationChecker;

     public function __construct(AuthorizationCheckerInterface $authorizationChecker)
     {
         $this->authorizationChecker = $authorizationChecker;
     }

     public function onKernelController(FilterControllerEvent $event)
     {
         $controller = $event->getController(); 

         if ($this->authorizationChecker->isGranted('IS_AUTHENTICATED_FULLY')) {
             // DO YOUR STUFF
         }       

         if ($controller[0] instanceof InitController) {

         }
         if (!is_array($controller)) {
             return;
         }


     }
  }

Upvotes: 6

Related Questions