Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring安全性:如何设置与上下文路径不同的Memberme cookie url路径?_Spring_Cookies_Spring Security - Fatal编程技术网

Spring安全性:如何设置与上下文路径不同的Memberme cookie url路径?

Spring安全性:如何设置与上下文路径不同的Memberme cookie url路径?,spring,cookies,spring-security,Spring,Cookies,Spring Security,如何在Spring Security中设置与上下文路径不同的Memberme cookie url路径 假设我的网站的主页url为(url重写): 我的登录页面有如下url: https://www.mysuperspecialdomain.com/shop/account/login 成功登录后,Memberme cookie具有路径/shop(在浏览器中可见,例如Chrome)。这是项目的上下文路径 这导致了这样一种情况,当我进入我的主页时,Memberme没有登录。只有当我导航到url时

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

假设我的网站的主页url为(url重写):

我的登录页面有如下url:

https://www.mysuperspecialdomain.com/shop/account/login
成功登录后,Memberme cookie具有路径
/shop
(在浏览器中可见,例如Chrome)。这是项目的上下文路径


这导致了这样一种情况,当我进入我的主页时,Memberme没有登录。只有当我导航到url时,它才以
https://www.myspecialdomain.com/shop
它正在运行。

如果您使用Spring Security 4.1.0或更高版本,您可以配置cookie域,请参阅:

“记住我”cookie可见的域名

但你不能改变现状


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

我找到了一个解决我自己问题的方法-可以通过
HttpServletResponseWrapper
来操纵Memberme cookie的路径。这就是解决方案(基于此答案):

  • 定义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);
        }
    }
    
  • 定义一个过滤器,用刚刚定义的包装器包装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);
            }
        }
    }
    
  • 将此筛选器添加到验证部件前面的Spring筛选器链:

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

  • 非常感谢。你是对的。但与其实现一个新的
    membermeservice
    ,我更愿意扩展现有的类似
    tokenbasedrembermeservices
    。这是描述的。我最担心的是:一旦我要使用新的Spring版本,我就必须检查
    setCookie
    方法是否已经像我的扩展版本那样实现了。Spring应该提供一个选项来配置这个…我已经找到了一个解决我自己问题的方法:。优点是,您不必更改Spring RemembermService实现。
    @Configuration
    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
         @Override
        protected void configure(HttpSecurity http) throws Exception {
    
            http.addFilterBefore(new RememberMeCookieFilter(), UsernamePasswordAuthenticationFilter.class)
            ...