如何让它在会话的一生中发挥作用,并在Symfony2中记住我



我想让会话超时。。即5分钟。但我也想有一个暂停8小时的"记住我"功能。

因此,我在config.yml中设置了会话超时,如下所示:

session: 
    cookie_lifetime: 300

然后我在security.yml中设置了"记住我"超时,如下所示:

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

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

我应该怎么做才能让他们一起工作?

嘿,这花了一些时间来追踪。:-p

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

答案更长: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开始起作用。


我不确定这是否应该被视为一个bug(提交的意外副作用)。也许我们中的一个人应该提交它,看看开发者们是怎么看待它的?

:-)

相关内容

最新更新