2016-03-26 60 views
3

我正在設置一個kernel.response事件,我想測試用戶是否登錄或不在其中。帶有授權檢查器的Symfony kernel.response監聽器

這裏是我的代碼:

services.yml

app.kernel.modal_injection: 
    class: App\UserBundle\EventListener\ModalListener 
    tags: 
     - { name: kernel.event_listener, event: kernel.response } 
    arguments: 
     - @security.authorization_checker 

ModalListener.php

<?php 
namespace App\UserBundle\EventListener; 

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\HttpKernel\Event\FilterResponseEvent; 
use Symfony\Component\HttpKernel\KernelEvents; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Symfony\Component\Security\Core\Security; 
use Symfony\Component\Security\Core\Authorization\AuthorizationChecker; 


class ConnectModalListener implements EventSubscriberInterface 
{ 
    protected $securityChecker; 

    public function __construct(AuthorizationChecker $securityChecker) 
    { 
     $this->securityChecker = $securityChecker; 
    } 

    public function onKernelResponse(FilterResponseEvent $event) 
    { 
     $response = $event->getResponse(); 
     $request = $event->getRequest(); 

     if (!$event->isMasterRequest()) { 
      return; 
     } 
     if ($request->isXmlHttpRequest()) { 
      return; 
     } 

     if ($this->securityChecker->isGranted('IS_AUTHENTICATED_REMEMBERED')) { 
      return; 
     } 

     // CODE HERE 


    } 

    public static function getSubscribedEvents() 
    { 
     return array(
      KernelEvents::RESPONSE => array('onKernelResponse', 0), 
     ); 
    } 
} 

我的問題是,在檢查,如果用戶IS_AUTHENTICATED_REMEMBER我在上服務CSS和JS文件得到一個錯誤500我的網頁(意思是沒有js或css就可以了)。有沒有收費的方法?最終過濾這些內核響應事件?

+0

你能分享來自Symfony的調試器確切的錯誤信息?你的CSS/JS應該一直工作。他們是靜態文件。 – mblaettermann

+0

我設法得到了我的錯誤:'內部服務器錯誤| Symfony \ Component \ Security \ Core \ Exception \ AuthenticationCredentialsNotFoundException [message]令牌存儲不包含身份驗證令牌。一個可能的原因可能是沒有爲此URL配置防火牆「 –

回答

1

令牌是在靜態文件null,因此isGranted返回一個錯誤500.所以我必須跑前檢查:

if ($this->tokenStorage->getToken() !== null 
     && $this->securityChecker->isGranted('IS_AUTHENTICATED_REMEMBERED')) { 
    return; 
} 
+0

但爲什麼您的靜態文件由php提供?聽起來像.htaccess中的配置錯誤 – mblaettermann

+0

@mblaettermann哦:/我想我有Symfony的默認設置。你有一個例子,我可以比較嗎? (我用'htaccess'不太好) –