2016-12-07 150 views
1

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

假设我的网站的首页网址(URL重写):

https://www.mysuperspecialdomain.com 

,而我的登录页面有这样的网址:

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

成功的登录之后了rememberMe的Cookie具有路径/shop (在浏览器中可见,例如Chrome)。这是项目的上下文路径。

这导致了这种情况,即当我要进入我的主页时,RememberMe没有登录。只有当我导航到一个URL时,它才从https://www.myspecialdomain.com/shop开始。

回答

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. 将此过滤器添加到验证部件前面的弹簧过滤器链中:

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

如果你使用Spring Security 4.1.0或更高版本,可以配置Cookie域,看RememberMeConfigurer#rememberMeCookieDomain

其内还记得我的cookie的域名是可见的。

但您无法更改context path

所以你必须实现你自己的RememberMeServices(你可以创建一个现有的子类)并将其与RememberMeConfigurer#rememberMeServices一起添加到你的安全配置中。

+1

谢谢。你是对的。但不是实现一个新的'RememberMeService',我更愿意扩展现有的'TokenBasedRememberMeServices'。描述了[在此链接](http://stackoverflow.com/questions/16015468/how-to-change-grails-spring-security-cookie-path)。我非常担心:尽快,因为我会使用新的Spring版本,所以我必须检查,如果'setCookie'方法已经在我的扩展版本中实现。春季应该提供一个选项来配置这个... – olivmir

+1

我已经找到了解决我自己的问题:[去这个](http://stackoverflow.com/a/41117823/7095884)。好处是,您不必更改Spring RememberMeService实现。 – olivmir