Symfony:在事件侦听器中检查用户授权

boo*_*erV 2 symfony

我是 Symfony 的新手(目前使用 Symfony 3.2),我正在学习如何创建事件侦听器以在每个控制器之前运行我的随机函数。我的目标是通过 isGranted() 函数检查用户是否已登录。看看我的代码

服务.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 }
Run Code Online (Sandbox Code Playgroud)

初始化监听器

> <?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;
>         }
>    
>    
>     }
>  }
Run Code Online (Sandbox Code Playgroud)

我应该怎么做才能在我的 InitListener 中使用 isGranted() 函数?

E.K*_*.K. 5

显然你应该传递security.authorization_checker给你的听众。

首先在配置

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

然后在代码中

 <?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;
         }


     }
  }
Run Code Online (Sandbox Code Playgroud)

  • 你和 OP 一样,应该在访问 `$controller[0]` 之前切换 `is_array`。 (2认同)