将过期时间添加到 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
,请使用添加TomcatContextCustomizer
的EmbeddedServletContainerCustomizer
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 OAuth2 不使用属性中的令牌过期值
将标头添加到 oauth/token 响应(spring-security)