2017-02-25 80 views
2

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

我忘了提及我使用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 } 

但它不工作...

+0

你尝试过这么远吗?你能和我们分享一些代码吗?也许这个链接将帮助你http://symfony.com/doc/current/components/security/authentication.html –

+0

您好,我已经包含了一些示例代码。 – r3m4k3

回答

0

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

然后,您可以创建一个YourOwnFactory类,它扩展Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\AbstractFactory并实现Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\SecurityFactoryInterface中,你可以定义你自己的身份验证提供者将因此处理认证会话处理。

了解更多关于在这里http://symfony.com/doc/current/security/custom_authentication_provider.html

security.yml

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

谢谢,那不是我想要做的。这个监听器处理认证失败/成功,我想处理会话过期。 – r3m4k3

+0

对不起,我的坏。我更新了我的答案。希望能帮助到你 –

相关问题