【问题标题】:Add expire to Spring Security remember me cookie将过期时间添加到 Spring Security 记住我的 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);

【问题讨论】:

    标签: spring tomcat cookies spring-boot spring-security


    【解决方案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());
                        }
    
                    });
                }
            }
       };
    }
    

    【讨论】:

      猜你喜欢
      • 2014-10-04
      • 2014-05-31
      • 2015-05-10
      • 2013-04-09
      • 2012-01-21
      • 2018-12-02
      • 2014-09-04
      • 2012-03-13
      • 1970-01-01
      相关资源
      最近更新 更多