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


我是Symfony

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

服务.yml

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

初始化侦听器

> <?php namespace AppBundleEventListener;
> 
> use AppBundleControllerInitController; use
> SymfonyComponentHttpKernelExceptionAccessDeniedHttpException; use
> SymfonyComponentHttpKernelEventFilterControllerEvent; use
> SymfonyComponentHttpFoundationSessionSession; 
>
>  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;
>         }
>    
>    
>     }
>  }

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

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

配置中的第一个

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

然后在代码中

 <?php namespace AppBundleEventListener;
 use AppBundleControllerInitController; 
 use SymfonyComponentHttpKernelExceptionAccessDeniedHttpException; 
 use SymfonyComponentHttpKernelEventFilterControllerEvent; 
 use SymfonyComponentHttpFoundationSessionSession; 
 use SymfonyComponentSecurityCoreAuthorizationAuthorizationCheckerInterface
 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;
         }

     }
  }

最新更新