如何让它在会话生命周期中工作并在Symfony2中记住我

时间:2013-11-20 17:04:09

标签: symfony session-timeout remember-me

我希望会话超时..即5分钟。但我也想记住我的功能,超时8小时。

所以我用config:

在config.yml中设置会话超时
session: 
    cookie_lifetime: 300

然后我在security.yml中设置了记住我的超时:

firewalls:
    main:            
        remember_me:
            key: '%secret%'
            lifetime: 28800
            path: /
            domain: ~     

所以,如果我在5分钟内继续工作然后我退出,一切顺利。但是,如果我保持非活动状态超过5分钟(会话超时)然后我退出,我会自动通过记住我的cookie进行身份验证。因此,如果我要注销,我必须在Logout链接中单击两次。

我该如何让它们一起工作?

1 个答案:

答案 0 :(得分:2)

嘿,这花了一些时间来追查。 :-P

快速回答:由于this提交的第92行,未调用注销处理程序(因此,不删除REMEMBERME cookie),除非securityContext中有令牌(即用户已登录) )。

更长的答案:AbstractRememberMeServicescancelCookie方法处理删除REMEMBERME令牌。 RememberMeFactory确保使用LogoutListener注册此抽象类的实现(通过一些涉及security.authentication.rememberme.services.*服务之一的复杂服务查找)。

LogoutListenerFirewall的一个侦听器)应该遍历其所有处理程序(实现LogoutHandlerInterface),并调用它们的logout方法。您可能正在使用PersistentTokenBasedRememberMeServices,其服务ID为security.authentication.rememberme.services.persistent且其logout方法调用上述cancelCookie方法,因此可能会删除REMEMBERME Cookie。

但是由于我上面解释的内容,从未为未登录的用户调用(由于会话已过期)。相反,logoutSuccessHandler会重定向您,并在以下请求中将剩余的REMEMBERME cookie启动。


我不确定这是否应该被视为错误(提交的意外副作用)或不是。也许我们中的一个人应该submit it并看看开发者对它的看法是什么?

: - )

相关问题