Spring Security:如何设置与上下文路径不同的RememberMe cookie URL路径?

时间:2016-12-07 10:35:05

标签: spring cookies spring-security

如何在Spring Security中设置一个与上下文路径不同的RememberMe cookie网址路径?

假设我网站的主页网址是(网址重写):

https://www.mysuperspecialdomain.com

我的登录页面有一个这样的网址:

https://www.mysuperspecialdomain.com/shop/account/login

成功登录后,RememberMe cookie的路径为/shop(在浏览器中可见,例如Chrome)。这是项目的上下文路径。

这导致了这种情况,当我访问我的主页时,RememberMe没有登录。只有当我导航到一个以https://www.myspecialdomain.com/shop开头的网址时,它才会这样做

2 个答案:

答案 0 :(得分:2)

如果您使用的是Spring Security 4.1.0或更高版本,则可以配置cookie域,请参阅RememberMeConfigurer#rememberMeCookieDomain

  

记住我cookie的域名可见。

但您无法更改context path

因此,您必须实现自己的RememberMeServices(您可以创建现有的子类)并将其RememberMeConfigurer#rememberMeServices添加到您的安全配置中。

答案 1 :(得分:1)

我找到了解决自己问题的方法 - 可以通过HttpServletResponseWrapper来管理RememberMe-cookie的路径。这是解决方案(基于此答案https://stackoverflow.com/a/7047298/7095884):

  1. 定义HttpServletResponseWrapper:

    public class RememberMeCookieResponseWrapper extends HttpServletResponseWrapper {
        public RememberMeCookieResponseWrapper(HttpServletResponse response) {
            super(response);
        }
    
        @Override
        public void addCookie(Cookie cookie) {
            if (cookie.getName().equals("shop")) {
                cookie.setPath("/");
            }
            super.addCookie(cookie);
        }
    }
    
  2. 定义一个过滤器,它使用刚才定义的包装器包装servlet响应:

    public class RememberMeCookieFilter implements Filter {
    
        public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    
            if (response instanceof HttpServletResponse) {
                HttpServletResponse newResponse =
                    new RememberMeCookieResponseWrapper((HttpServletResponse)response);
                chain.doFilter(request, newResponse);
            }
        }
    }
    
  3. 将此过滤器添加到身份验证部分前面的Spring Filter Chain:

    @Configuration
    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
         @Override
        protected void configure(HttpSecurity http) throws Exception {
    
            http.addFilterBefore(new RememberMeCookieFilter(), UsernamePasswordAuthenticationFilter.class)
            ...