繁体   English   中英

使用Spring Security滚动记住我的Cookie

[英]Rolling remember me cookies with Spring Security

我正在使用Spring的TokenBasedRememberMeServicesRememberMeAuthenticationFilter通过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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM