i有一个Symfony 2.5项目,其中fosuserbundle集成了。我希望在应用程序上使用x上的空闲时间登录的用户自动登录并重定向到页面中的符号。
到目前为止,我已经实施了一个解决方案,这与此处建议的建议非常相似,如何在不活动之后自动登录用户?
<?php
namespace MyProjectUserBundleEventListener;
use SymfonyComponentRoutingRouterInterface;
use SymfonyComponentHttpFoundationRedirectResponse;
use SymfonyComponentHttpFoundationSessionSessionInterface;
use SymfonyComponentSecurityCoreSecurityContextInterface;
use SymfonyComponentHttpKernelHttpKernelInterface;
use SymfonyComponentHttpKernelEventFilterControllerEvent;
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;
}
}
}
}
问题在于,此事件将被触发,并且重定向只有在用户在空闲时间后尝试加载应用程序中的任何内容时才会发生。我想要的是该应用自动将其重定向到注册页面而无需用户互动。
我来了这个建议,要使用刷新元标记如何自动在会话时间后自动将用户自动重定向吗?p>
Meta Refresh如果定期重新加载不会惹恼您的用户,则可以。这可能是最可靠的。您也可以像这样实现JavaScript/jQuery片段,以便反复使用服务器:
setTimeout(checkIdleTime, 2000);
在这种情况下,每个2000
毫秒或每两秒钟一次。
function checkIdleTime() {
$.get('/idle', function()) {
// If HTTP_OK response, do nothing, otherwise handle error
}
}
将/idle
URL映射到检查"空闲度"的操作。当然,该行动必须忽略自己的请求。返回成功(如果不是闲置),则否则可以将用户注销并返回某种错误。处理jQuery响应中的错误;可能是一个简单的重定向:window.location.href = '/login';
查看fosjsroutingbundle,以优雅地使用jQuery的符号路线,因此您不必进行硬码URL。