【问题标题】:Spring Security: How can I set a RememberMe cookie url path, that differs from the context path?Spring Security:如何设置与上下文路径不同的 RememberMe cookie url 路径?
【发布时间】:2017-04-22 06:14:33
【问题描述】:

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

假设我网站的首页url是(url rewrite):

https://www.mysuperspecialdomain.com

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

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

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

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

【问题讨论】:

    标签: spring cookies spring-security


    【解决方案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过滤器链中:

      @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

      remember me cookie 可见的域名。

      但您不能更改context path

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

      【讨论】:

      • 谢谢。你说的对。但与其实现新的RememberMeService,我更喜欢扩展现有的TokenBasedRememberMeServicesIn this link 已描述。我非常担心:一旦我将使用新的 Spring 版本,我将不得不检查 setCookie 方法是否已像在我的扩展版本中那样实现。 Spring 应该提供一个选项来配置这个 ...
      • 我找到了解决我自己问题的方法:go to this。优点是,您不必更改 Spring RememberMeService 的实现。
      猜你喜欢
      • 1970-01-01
      • 2015-09-09
      • 2022-01-25
      • 2013-04-07
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      • 2016-02-14
      相关资源
      最近更新 更多