我实现了一个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 }
但它不工作...
你尝试过这么远吗?你能和我们分享一些代码吗?也许这个链接将帮助你http://symfony.com/doc/current/components/security/authentication.html –
您好,我已经包含了一些示例代码。 – r3m4k3