将过期时间添加到 Spring Security 记住我的 cookie

Posted

技术标签:

【中文标题】将过期时间添加到 Spring Security 记住我的 cookie【英文标题】:Add expire to Spring Security remember me cookie 【发布时间】:2017-05-12 02:00:06 【问题描述】:

我正在使用 Spring Boot 1.4.2(带有嵌入式 Tomcat)、Spring MVC 4.3.4 和 Spring Security 4.1.3 来构建一个简单的网站。我的登录页面包含一个记住我的复选框,用于切换是否由 Spring Security 创建记住我的 cookie。

此 cookie 在 Chrome 和 Firefox 中设置得非常好,但由于 IE 和 MS Edge 不使用 Max-Age 属性,它们只会创建会话 cookie。有没有办法让 Spring Security(除了 Max-Age)在 Set-Cookie 标头上为记住我的 cookie 设置 Expire 属性?

下面是我的 Spring Security 配置:

    http.authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .antMatchers("/private/**").authenticated()
            .anyRequest().permitAll()
            .and()
        .httpBasic()
            .and()
        .formLogin()
            .loginPage("/login").permitAll().and()
        .rememberMe()
            .tokenValiditySeconds(365 * 24 * 60 * 60)
            .and()
        .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED);

【问题讨论】:

【参考方案1】:

除了Max-Age,您还可以添加Expires 属性。

配置是容器的一部分,见Apache Tomcat 8 Configuration Reference:

总是添加过期

如果这是true Tomcat 将始终将 expires 参数添加到 SetCookie 标头,即使对于版本大于零的 cookie 也是如此。这是为了解决一个已知的 IE6 和 IE7 错误,该错误导致我忽略 SetCookie 标头中的 Max-Age 参数。

如果org.apache.catalina.STRICT_SERVLET_COMPLIANCE 设置为true,则此设置的默认值为false,否则默认值为true。

但是在 Spring Boot 中,Expires 没有 Common application properties。所以你得把CookieProcessor改成LegacyCookieProcessor并进行配置,见Spring Boot Reference Guide:

70.10 使用 Tomcat 的 LegacyCookieProcessor

Spring Boot使用的嵌入式Tomcat不支持开箱即用的Cookie格式的“Version 0”,你可能会看到如下错误:

java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value

如果可能,您应该考虑更新您的代码以仅存储符合以后 Cookie 规范的值。但是,如果您无法更改 cookie 的写入方式,则可以将 Tomcat 配置为使用 LegacyCookieProcessor。要切换到LegacyCookieProcessor,请使用添加TomcatContextCustomizerEmbeddedServletContainerCustomizer bean:

@Bean
public EmbeddedServletContainerCustomizer cookieProcessorCustomizer() 
    return new EmbeddedServletContainerCustomizer() 

        @Override
        public void customize(ConfigurableEmbeddedServletContainer container) 
            if (container instanceof TomcatEmbeddedServletContainerFactory) 
                ((TomcatEmbeddedServletContainerFactory) container)
                       .addContextCustomizers(new TomcatContextCustomizer() 

                    @Override
                    public void customize(Context context) 
                       context.setCookieProcessor(new LegacyCookieProcessor());
                    

                );
            
        
   ;

【讨论】:

以上是关于将过期时间添加到 Spring Security 记住我的 cookie的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security:会话过期而不重定向到过期网址?

强制用户在 Spring Security 中更改过期密码

Spring Security OAuth2 不使用属性中的令牌过期值

将标头添加到 oauth/token 响应(spring-security)

260.Spring Boot+Spring Security:设置登录过期时间的正确姿势

将 Spring Security 添加到现有 Spring AngularJS 应用程序