Symfony 2.5 - 一段时间不活动后自动重定向
Symfony 2.5 - automatic redirect after a period of inactivity
我有一个集成了 FOSUserBundle 的 Symfony 2.5 项目。我希望任何在应用程序上有 X 空闲时间的登录用户自动注销并重定向到登录页面。
到目前为止,我已经实施了一个解决方案,与此处建议的非常相似How to log users off automatically after a period of inactivity?
<?php
namespace MyProject\UserBundle\EventListener;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
class UserInactivityListener
{
protected $session;
protected $securityContext;
protected $router;
protected $maxIdleTime;
public function __construct(
SessionInterface $session,
SecurityContextInterface $securityContext,
RouterInterface $router,
$maxIdleTime = 0)
{
$this->session = $session;
$this->securityContext = $securityContext;
$this->router = $router;
$this->maxIdleTime = $maxIdleTime;
}
/**
* user will be logged out after 30 minutes of inactivity
*
* @param FilterControllerEvent $event
* @return type
*/
public function onKernelController(FilterControllerEvent $event)
{
if (HttpKernelInterface::MASTER_REQUEST != $event- >getRequestType()) {
return;
}
if ($this->maxIdleTime > 0) {
try {
$this->session->start();
$lapse = time() - $this->session->getMetadataBag()->getLastUsed();
$isFullyAuthenticated = $this->securityContext->isGranted('IS_AUTHENTICATED_FULLY');
if (($lapse > $this->maxIdleTime) && $isFullyAuthenticated == true) {
$this->securityContext->setToken(null);
$url = $this->router->generate('fos_user_security_login');
$event->setController(function() use ($url) {
return new RedirectResponse($url);
});
}
} catch (\Exception $ex) {
return;
}
}
}
}
问题是只有当用户在空闲时间后尝试在应用程序中加载任何内容时,才会触发此事件并且重定向才会发生。我想要的是应用程序自动重定向到注册页面,而无需用户进行任何交互。
我偶然发现了使用刷新元标记的建议 How to auto redirect a user in Symfony after a session time out?,但我想知道是否有另一种更好的方式来不时触发刷新事件?
如果定期页面重新加载不会惹恼您的用户,元刷新就可以了。这可能是最可靠的。您还可以实现一个 JavaScript/jQuery 片段,以便重复 ping 服务器:
setTimeout(checkIdleTime, 2000);
在这种情况下,每 2000
毫秒或每两秒。
function checkIdleTime() {
$.get('/idle', function()) {
// If HTTP_OK response, do nothing, otherwise handle error
}
}
将 /idle
URL 映射到检查 "idleness" 的操作。当然,该操作必须忽略对自身的请求。 Return 如果不空闲则成功,否则强制注销用户和 return 某种错误。处理jQuery响应中的错误;可能一个简单的重定向就可以了:window.location.href = '/login';
查看 FOSJsRoutingBundle 以优雅地使用来自 jQuery 的 Symfony 路由,这样您就不必对 URL 进行硬编码。
我有一个集成了 FOSUserBundle 的 Symfony 2.5 项目。我希望任何在应用程序上有 X 空闲时间的登录用户自动注销并重定向到登录页面。
到目前为止,我已经实施了一个解决方案,与此处建议的非常相似How to log users off automatically after a period of inactivity?
<?php
namespace MyProject\UserBundle\EventListener;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
class UserInactivityListener
{
protected $session;
protected $securityContext;
protected $router;
protected $maxIdleTime;
public function __construct(
SessionInterface $session,
SecurityContextInterface $securityContext,
RouterInterface $router,
$maxIdleTime = 0)
{
$this->session = $session;
$this->securityContext = $securityContext;
$this->router = $router;
$this->maxIdleTime = $maxIdleTime;
}
/**
* user will be logged out after 30 minutes of inactivity
*
* @param FilterControllerEvent $event
* @return type
*/
public function onKernelController(FilterControllerEvent $event)
{
if (HttpKernelInterface::MASTER_REQUEST != $event- >getRequestType()) {
return;
}
if ($this->maxIdleTime > 0) {
try {
$this->session->start();
$lapse = time() - $this->session->getMetadataBag()->getLastUsed();
$isFullyAuthenticated = $this->securityContext->isGranted('IS_AUTHENTICATED_FULLY');
if (($lapse > $this->maxIdleTime) && $isFullyAuthenticated == true) {
$this->securityContext->setToken(null);
$url = $this->router->generate('fos_user_security_login');
$event->setController(function() use ($url) {
return new RedirectResponse($url);
});
}
} catch (\Exception $ex) {
return;
}
}
}
}
问题是只有当用户在空闲时间后尝试在应用程序中加载任何内容时,才会触发此事件并且重定向才会发生。我想要的是应用程序自动重定向到注册页面,而无需用户进行任何交互。
我偶然发现了使用刷新元标记的建议 How to auto redirect a user in Symfony after a session time out?,但我想知道是否有另一种更好的方式来不时触发刷新事件?
如果定期页面重新加载不会惹恼您的用户,元刷新就可以了。这可能是最可靠的。您还可以实现一个 JavaScript/jQuery 片段,以便重复 ping 服务器:
setTimeout(checkIdleTime, 2000);
在这种情况下,每 2000
毫秒或每两秒。
function checkIdleTime() {
$.get('/idle', function()) {
// If HTTP_OK response, do nothing, otherwise handle error
}
}
将 /idle
URL 映射到检查 "idleness" 的操作。当然,该操作必须忽略对自身的请求。 Return 如果不空闲则成功,否则强制注销用户和 return 某种错误。处理jQuery响应中的错误;可能一个简单的重定向就可以了:window.location.href = '/login';
查看 FOSJsRoutingBundle 以优雅地使用来自 jQuery 的 Symfony 路由,这样您就不必对 URL 进行硬编码。