【问题标题】:When does spring security remember me process the cookie?Spring Security 什么时候记得我处理 cookie?
【发布时间】:2012-08-15 11:26:35
【问题描述】:

Spring 安全 3.1.1

所以我做了一个自定义的记住我服务,它扩展了基于默认令牌的记住我服务,只是为了检查它是否被调用。

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices;

public class CustomTokenBasedRememberMeService extends TokenBasedRememberMeServices {

    @Override
    protected int calculateLoginLifetime(HttpServletRequest request, Authentication authentication) {
        System.out.println("COOKIE: Process1!");
        return super.calculateLoginLifetime(request, authentication);
    }

    @Override
    protected boolean isTokenExpired(long tokenExpiryTime) {
        System.out.println("COOKIE: Process2!");
        return super.isTokenExpired(tokenExpiryTime);
    }

    @Override
    protected String makeTokenSignature(long tokenExpiryTime, String username, String password) {
        System.out.println("COOKIE: Process3!");
        return super.makeTokenSignature(tokenExpiryTime, username, password);
    }

    @Override
    protected String retrievePassword(Authentication authentication) {
        System.out.println("COOKIE: Process4!");
        return super.retrievePassword(authentication);
    }

    @Override
    protected String retrieveUserName(Authentication authentication) {
        System.out.println("COOKIE: Process5!");
        return super.retrieveUserName(authentication);
    }

    @Override
    protected UserDetails processAutoLoginCookie(String[] cookieTokens, HttpServletRequest request, HttpServletResponse response) {
        System.out.println("COOKIE: Process6!");
        return super.processAutoLoginCookie(cookieTokens, request, response);
    }    

    @Override
    public void onLoginSuccess(HttpServletRequest request, HttpServletResponse response, Authentication successfulAuthentication) {
        System.out.println("COOKIE: Process7!");
        super.onLoginSuccess(request, response, successfulAuthentication);
    }
}

当我登录时它会打印出来:

INFO: COOKIE: Process7!
INFO: COOKIE: Process5!
INFO: COOKIE: Process4!
INFO: COOKIE: Process1!
INFO: COOKIE: Process3!

这意味着它调用了 onLoginSuccess()、retrieveUserName()、retrievePassword()、calculateLoginLifetime() 和 makeTokenSignature()。

浏览器已接受 cookie,但从未处理过。即使在我删除会话、重新启动浏览器等之后。它从未被处理,我认为 processAutoLoginCookie 对此负责,但它也从未被调用。

spring security处理cookie的条件是什么?

【问题讨论】:

    标签: java cookies spring-security remember-me


    【解决方案1】:

    在您的情况下,您使用 TokenBasedRememberMeServices。处理发生在 parentAbstractRememberMeServices 中。它发生在它的 autoLogin() 方法上。

    此方法由 RememberMeAuthenticationFilter.doFilter() 调用。过滤器将 rememberServices 保留为成员并调用其 autoLogin()。所以不管你是使用 PersistentTokenBasedRememberMeServices 还是使用 TokenBasedRememberMeServices 都没有关系,Cookie 的处理是一样的,由父级处理。

    【讨论】:

    • 我可以看到,如果 SecurityContextHolder.getContext().getAuthentication()==null 那么它调用 autoLogin() 方法我不能覆盖 autoLogin() 因为它被声明为 final。所以我相信它工作得很好,我注意到它之后调用了 processAutoLoginCookie() 方法。但是该方法永远不会被调用。因此,我假设 Authentication 永远不会为 null,或者 doFilter() 方法一开始就不会被调用。您对此有何看法?
    • 首先,您可以轻松调试Spring的代码。然后您将能够看到流程以及发生的情况。其次,如果您将日志放入“调试”中,您将看到 Springs 日志(它们在 autoLogin() 中有一个)。这样您就可以知道是否调用了 autoLogin()。注意 autoLogin() 可以被调用,但是如果它没有找到 Cookie,它会返回 null 所以不会调用“processAutoLoginCookie()”。如果有帮助,请随时将我的答案标记为好答案:-)
    • processAutoLoginCookie 方法什么时候调用?
    • 从类中复制的描述:AbstractRememberMeServices:从 autoLogin 调用以处理提交的持久登录 cookie。子类应验证 cookie 并执行所需的任何额外管理。 docs.spring.io/spring-security/site/docs/2.0.7.RELEASE/apidocs/…
    • 我已经实现了基于令牌的记住我。在其中一个博客中,我读到,一旦会话超时,就会调用记住我。我有两个问题。 1)是否要在remember me中重新设置cookie token的有效期? 2)如果我从其他页面刷新,即不是登录页面,会记住我的方法还是调用自动登录?
    猜你喜欢
    • 2015-09-26
    • 1970-01-01
    • 2011-08-05
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多