Session Symfony redirec在会话到期后登录页面

Session Symfony redirec在会话到期后登录页面,session,authentication,authorization,symfony,Session,Authentication,Authorization,Symfony,我已经实现了一个restful api。 我在会话处理方面遇到了问题。 当会话超时时,用户可以刷新页面,然后他会收到500个错误,因为$this->getUser()为空,我需要记录此端点的用户数据。 所以,当用户刷新页面并且他的会话已过期时,我想抛出403错误或只是重定向到某个url。 我怎么做? 我想我应该使用内核侦听器,但是如何检查会话是否已经过期?也许有一种只修改security.yml的解决方案 我忘了提到我使用jms/di额外捆绑包,所以我将管理器注入控制器。这些管理器在控制器操作之

我已经实现了一个restful api。 我在会话处理方面遇到了问题。 当会话超时时,用户可以刷新页面,然后他会收到500个错误,因为$this->getUser()为空,我需要记录此端点的用户数据。 所以,当用户刷新页面并且他的会话已过期时,我想抛出403错误或只是重定向到某个url。 我怎么做? 我想我应该使用内核侦听器,但是如何检查会话是否已经过期?也许有一种只修改security.yml的解决方案

我忘了提到我使用jms/di额外捆绑包,所以我将管理器注入控制器。这些管理器在控制器操作之前运行,所以我需要检查用户是否仍然登录到管理器中,而不是控制器中。我不想在每个管理者的行为中重复代码,我怎样才能以更优雅的方式来做呢

我尝试将侦听器与内核*操作一起使用,例如:

class KernelListener
{

private $tokenStorage;

public function __construct(TokenStorageInterface $tokenStorage)
{
    $this->tokenStorage = $tokenStorage;
}

public function onKernelRequest(GetResponseEvent $event)
{
    $kernel    = $event->getKernel();
    $request   = $event->getRequest();
            $user = $this->tokenStorage->getToken()->getUser();

    if(!$user instanceof SempUser || $user == null) {
        throw new AccessDeniedException();
    }
}

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

    $user = $this->tokenStorage->getToken()->getUser();

    if(!$user instanceof SempUser || $user == null) {
        throw new AccessDeniedException();
    }

}

public function onKernelException(GetResponseForExceptionEvent $event)
{
    $user = $this->tokenStorage->getToken()->getUser();

    if(!$user instanceof SempUser || $user == null) {
        throw new AccessDeniedException();
    }

}

}
和我的服务。yml:

kernel.listener:
        class: AppBundle\Listener\KernelListener
        arguments: ["@security.token_storage"]
        tags:
            - { name: kernel.event_listener, event: kernel.exception }
            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
            - { name: kernel.event_listener, event: kernel.response, method: onKernelResponse }

但是它不起作用…

对于会话处理,我建议利用security.yml。您可以为应用程序()定义防火墙规则和安全区域

然后,您可以创建一个
YourOwnFactory
类,该类扩展
Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\AbstractFactory
,并实现
Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\SecurityFactoryInterface
,在该类中您可以定义自己的身份验证提供程序处理身份验证会话处理

在这里阅读更多关于它的信息

security.yml

security:
    firewalls:
        [...]
        secured_area:
            pattern: ^/
            your_own_factory: ~ #tells symfony to use the AppBundle\Security\YourOwnFactory 

到目前为止你试过什么?你能和我们分享一些代码吗?也许这个链接会帮助你,我已经包括了一些示例代码。谢谢你,这不是我想做的。此侦听器处理身份验证失败/成功,我想处理会话过期。