[英]Rolling remember me cookies with Spring Security
我正在使用Spring的TokenBasedRememberMeServices和RememberMeAuthenticationFilter
通过Base-64编码的cookie来识别以前记住的用户。 根据界面协定,仅在每次交互式登录后才设置/更新cookie。 这意味着在每次成功的基于cookie的登录后,cookie的TTL不会更新。
我现在正在寻找一种使用TokenBasedRememberMeServices的方法来延长每次成功登录(交互式或非交互式)之后的时间。 我当时正在考虑向过滤器中添加AuthenticationSuccessHandler
,或者在同一类中重写onSuccessfulAuthentication
,但是我很好奇,如果a)你们中的任何一个遇到相同的问题,并且b)为什么这不是RememberMeServices的内置选项。
PS:“滚动记住我的cookie”具有明显的安全缺陷,因为一个cookie基本上可以使您永远不知道密码就永远登录,但是让我们将此问题放在一边。
我相信您已经完全回答了自己的问题。 处理它的正确方法是实现AuthenticationSuccessHandler
。 这是成功执行自定义逻辑的正确位置。 您还解释了为什么很少遇到这种情况,同时又为什么没有现成的解决方案。 我不能说我在网上狂野地看到了这种行为。
当我阅读TokenBasedRememberMeServices
的代码以给出替代答案时,我发现了这一行:
public void onLoginSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication successfulAuthentication) {
int tokenLifetime = calculateLoginLifetime(request, successfulAuthentication);
long expiryTime = System.currentTimeMillis();
// SEC-949
expiryTime += 1000L* (tokenLifetime < 0 ? TWO_WEEKS_S : tokenLifetime);
String signatureValue = makeTokenSignature(expiryTime, username, password);
setCookie(new String[] {username, Long.toString(expiryTime), signatureValue}, tokenLifetime, request, response);
如您所见,有一种机制可以通过将tokenLifetime
设置为负值来延长每次用户成功登录时的cookie寿命。
如果看到SEC-949 ,它描述了功能:
我已经在TokenBasedRememberMeServices中添加了对此的支持。 它允许使用负值作为tokenValiditySeconds属性。 如果该值为负,则令牌expiryTime(用于签名)将默认保留14天,但是cookie maxAge将被设置为负值,以防止在浏览器关闭时将其保留在客户端上。
PersistentTokenBasedRememberMeServices将在初始化时拒绝负值。
如果您想进行更多自定义,我想您需要扩展该类,或修改该类并将补丁发送给spring。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.