我实施了一个安静的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 }
但它不起作用......
答案 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