2016-11-08 86 views
0

我遇到了FOSUserBundle問題。RedirectionListener.php中的FatalErrorException第46行:錯誤:調用非對象的成員函數getUser()

我有一個重定向偵聽器,以防止用戶使用的應用程序沒有被登錄,下面的代碼:

class RedirectionListener 
{ 
    /** 
    * RedirectionListener constructor. 
    * @param ContainerInterface $container 
    * @throws \Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException 
    * @throws \Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException 
    */ 
    public function __construct(ContainerInterface $container) 
    { 
     $this->router = $container->get('router'); 
     $this->securityTokenStorage = $container->get('security.token_storage'); 
    } 

    /** 
    * @param GetResponseEvent $event 
    * @throws \InvalidArgumentException 
    */ 
    public function onKernelRequest(GetResponseEvent $event){ 

    $route = $event->getRequest()->attributes->get('_route'); 

    if($route !== 'fos_user_security_login' && 
     $route !== 'fos_user_resetting_reset' && 
     $route !== 'fos_user_resetting_request' && 
     $route !== 'fos_user_resetting_send_email' && 
     $route !== 'fos_user_resetting_check_email' && 
     $route !== 'fos_user_change_password' && 
     !is_object($this->securityTokenStorage->getToken()->getUser())) //this is line 46 
     { 
     $event->setResponse(new RedirectResponse($this->router->generate('fos_user_security_login'))); 
     } 
    } 
} 

這是我的服務:

services: 
redirectonListener: 
    class: Projects\ProjectsBundle\Listener\RedirectionListener 
    arguments: ['@service_container'] 
    tags: 
     - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } 

而且這裏離我的防火牆設置FOSUserBundle Docs:

firewalls: 
    # disables authentication for assets and the profiler, adapt it according to your needs 
    dev: 
     pattern: ^/(_(profiler|wdt)|css|images|js)/ 
     security: false 

    main: 
     pattern: ^/ 
     form_login: 
      provider: fos_userbundle 
      csrf_token_generator: security.csrf.token_manager 
      # if you are using Symfony < 2.8, use the following config instead: 
      # csrf_provider: form.csrf_provider 

     logout:  true 
     anonymous: true 

我正在使用Symfony 2.8版本。誰能幫忙!

+0

在構造函數中:var_dump($ container-> get('security.token_storage'));什麼說? – Deep

+0

我可能在這裏錯了,但你不能像這樣檢查嗎? if($ this-> get('security.authorization_checker') - > isGranted('IS_AUTHENTICATED_FULLY')=== false) – Thomas

+0

@Deep這裏是var_dump的結果:'object(Symfony \ Component \ Security \ Core \ Authentication \ Token \ Storage \ TokenStorage)#264(1){[「token」:「Symfony \ Component \ Security \ Core \ Authentication \ Token \ Storage \ TokenStorage」:private] => NULL} –

回答

2

您是否嘗試在security.yml中設置access_control

例如:

security: 
    #[...] 

    access_control: 
     - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     # and so on, until: 
     - { path: ^/restricted, role: ROLE_USER } 
     # or: 
     - { path: ^/*, role: IS_AUTHENTICATED_ANONYMOUSLY } 

編輯:不要忘記清除緩存的變化作出後。

+0

非常感謝,我修改了我的security.yml文件,如下所示:'access_control: - {path:^/login $,role:IS_AUTHENTICATED_ANONYMOUSLY} - {path:^/register,role:IS_AUTHENTICATED_ANONYMOUSLY} - {path:^/重置,角色:IS_AUTHENTICATED_ANONYMOUSLY} - {path:^/admin /,role:ROLE_ADMIN} - {path:^/*,role:ROLE_USER}'它甚至不需要重定向偵聽器。 –

+0

不客氣,很高興我可以幫助:) – Dennis

0

我只是給你一個例子,以便你可以修改它以滿足你的需求。除了聽衆這樣做的方式之外,你應該看看FOS中的security.yml方法。有很多例子。例如,在http://www.inanzzz.com/中搜索access_control,這會給你6個例子來研究一下。

注意:切勿將整個容器注入爲服務參數!

一些例子。

服務

services: 
    application_frontend.event_listener.order_create: 
     class: Application\FrontendBundle\EventListener\OrderCreateListener 
     arguments: 
      - @router 
     tags: 
      - { name: kernel.event_listener, event: kernel.controller, method: onKernelController } 

LISTENER

namespace Application\FrontendBundle\EventListener; 

use Application\FrontendBundle\Controller\OrderController; 
use Symfony\Component\HttpKernel\Event\FilterControllerEvent; 
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; 
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; 
use Symfony\Component\Routing\RouterInterface; 

class OrderCreateListener 
{ 
    private $router; 
    private $redirectRoute = 'fos_user_security_login'; 
    private $invalidRoutes = ['fos_user_security_login', '...', '...']; 

    public function __construct(
     RouterInterface $router 
    ) { 
     $this->router = $router; 
    } 

    public function onKernelController(FilterControllerEvent $event) 
    { 
     $controller = $event->getController(); 
     if (!is_array($controller)) { 
      return; 
     } 

     if (
      $event->isMasterRequest() && // If it is user request 
      $controller[0] instanceof OrderController && // Change it to your controller 
      $this->isValidRoute($event) !== false 
     ) { 
      return; 
     } 

     $url = $this->router->generate($this->redirectRoute); 
     $response = new RedirectResponse($url); 
     $event->setResponse($response); 
    } 

    private function isCreateCarMethod(FilterControllerEvent $event) 
    { 
     $currentRoute = $event->getRequest()->attributes->get('_route'); 
     if (in_array(currentRoute, $this->invalidRoutes)) { 
      return false; 
     } 
    } 
} 
+0

感謝您的回答,我發現修改'security.yml'文件中的'access_control'更合適。 –

+0

很好,你解決了它。正如我還建議'access_control'的方式來做到這一點。 – BentCoder

相關問題