会话到期后Symfony重定向到登录页面

时间:2017-02-25 20:28:02

标签: session authentication authorization symfony

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

我忘了提到我使用jms / di-extra-bundle,所以我将管理员注入控制器。这些管理器在控制器操作之前运行,因此我需要检查用户是否仍然登录管理器,而不是控制器。我不想在每个经理的行动中复制代码,我怎样才能以更优雅的方式做到?

我尝试使用内核*动作的监听器,例如:

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();
    }

}

}

我的services.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 }

但它不起作用......

1 个答案:

答案 0 :(得分:0)

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

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

在此处详细了解http://symfony.com/doc/current/security/custom_authentication_provider.html

<强> security.yml

Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\SecurityFactoryInterface