FatalErrorException in RedirectionListener.php line 46: Error: Call to a member function getUser() on a non-object
FatalErrorException in RedirectionListener.php line 46: Error: Call to a member function getUser() on a non-object
我在使用 FOSUserBundle 时遇到问题。
我有一个重定向侦听器来防止用户在未登录的情况下使用该应用程序,代码如下:
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 文档中的防火墙设置:
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 版本。谁能帮忙!
您是否尝试在 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 }
编辑:修改后不要忘记清除缓存。
我只是给你举个例子,这样你就可以修改它以满足你的需要。除了听众的方式之外,您还应该研究 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 }
聆听者
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;
}
}
}
我在使用 FOSUserBundle 时遇到问题。
我有一个重定向侦听器来防止用户在未登录的情况下使用该应用程序,代码如下:
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 文档中的防火墙设置:
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 版本。谁能帮忙!
您是否尝试在 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 }
编辑:修改后不要忘记清除缓存。
我只是给你举个例子,这样你就可以修改它以满足你的需要。除了听众的方式之外,您还应该研究 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 }
聆听者
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;
}
}
}