Cookies Spring Security中会话cookie的相同站点标志

Cookies Spring Security中会话cookie的相同站点标志,cookies,spring-security,csrf,jsessionid,samesite,Cookies,Spring Security,Csrf,Jsessionid,Samesite,可以在Spring Security中设置标志吗 如果没有,是否在路线图上添加支持?一些浏览器(如Chrome)已经提供了支持。如果您可以获得HttpServletResponse的实例,您可以在Java世界中自己设置cookie值 然后你可以做: response.setHeader(“Set Cookie”,“key=value;HttpOnly;SameSite=strict”) 在spring security中,您可以通过过滤器轻松实现这一点,下面是一个示例: 公共类CustomFi

可以在Spring Security中设置标志吗


如果没有,是否在路线图上添加支持?一些浏览器(如Chrome)已经提供了支持。

如果您可以获得
HttpServletResponse
的实例,您可以在Java世界中自己设置cookie值

然后你可以做:

response.setHeader(“Set Cookie”,“key=value;HttpOnly;SameSite=strict”)
在spring security中,您可以通过过滤器轻松实现这一点,下面是一个示例:

公共类CustomFilter扩展了GenericFilterBean{
@凌驾
public void doFilter(ServletRequest请求、ServletResponse响应、,
FilterChain链)抛出IOException、ServletException{
HttpServletResponse resp=(HttpServletResponse)响应;
相应的setHeader(“Set Cookie”,“locale=de;HttpOnly;SameSite=strict”);
链式过滤器(请求、响应);
}
}
将此筛选器添加到SecurityConfig,如下所示:

http.addFilterAfter(新的CustomFilter(),BasicAuthenticationFilter.class)
或通过XML:


在身份验证成功处理程序中,您可以用这种方式提及,而不是过滤器

@覆盖
验证成功时的公共无效(
HttpServletRequest请求,HttpServletResponse响应,
身份验证)引发IOException{
response.setStatus(HttpServletResponse.SC_OK);
clearAuthenticationAttributes(请求);
addSameSiteCookieAttribute(响应);
处理(请求、响应);
}
私有void addSameSiteCookieAttribute(HttpServletResponse){
Collection headers=response.getHeaders(HttpHeaders.SET\u COOKIE);
布尔值firstHeader=true;
//可以有多个Set Cookie属性
for(字符串标题:标题){
如果(第一个标题){
response.setHeader(HttpHeaders.SET_COOKIE,
格式(“%s;%s”,标题,“SameSite=Strict”);
firstHeader=false;
继续;
}
response.addHeader(HttpHeaders.SET_COOKIE,
格式(“%s;%s”,标题,“SameSite=Strict”);
}
}

其中一个答案提到了这一点。在我实现该链接后找不到它。

使用SpringBoot中的拦截器

我正在寻找添加SameSite的解决方案,我只想将该属性添加到现有的“Set Cookie”,而不是创建新的“Set Cookie”。 我尝试了几种方法来满足这一要求,包括:

  • 添加一个自定义过滤器,如@unwichtich所说
  • 而且我还超越了basicAuthenticationFilter。它确实添加了SameSite属性。而Spring添加“Set Cookie”的时间很难把握。我认为在onAuthenticationSuccess()方法中,响应必须有这个头,但它没有。我不确定这是否是我定制的basicAuthenticationFilter订单的错
  • 使用cookieSerializer,但是spring会话版本出现了一个问题。似乎只有最新版本支持它,但我仍然无法确定应该将版本号添加到依赖项列表中。
    不幸的是,上面没有一个能像预期的那样添加相同的内容
  • 最后,我发现春天的拦截器可以帮助我实现它。 我花了一个星期才拿到。希望这能帮助你,如果有人有同样的问题

    @组件
    公共类CookieServiceInterceptor扩展HandlerInterceptor适配器{
    @凌驾
    公共布尔预处理(
    HttpServletRequest请求、HttpServletResponse响应、对象处理程序)引发异常{
    返回true;
    }
    @凌驾
    公共无效后句柄(
    HttpServletRequest请求,HttpServletResponse响应,对象处理程序,
    ModelAndView(ModelAndView)引发异常{
    //检查响应中是否有“set cookie”,如果有,则添加“SameSite”属性
    //应该在第一次成功登录的响应中找到它
    Collection headers=response.getHeaders(HttpHeaders.SET\u COOKIE);
    布尔值firstHeader=true;
    对于(字符串头:头){//可以有多个集Cookie属性
    如果(第一个标题){
    setHeader(HttpHeaders.SET_COOKIE,String.format(“%s;%s”,header,“SameSite=strict”);
    firstHeader=false;
    继续;
    }
    addHeader(HttpHeaders.SET_COOKIE,String.format(“%s;%s”,header,“SameSite=strict”);
    }
    }
    @凌驾
    完成后公共无效(HttpServletRequest请求、HttpServletResponse响应、,
    对象处理程序,异常)引发异常{
    }
    }
    
    您还需要让这个拦截器在您的应用程序中工作,这意味着您应该添加一个bean,如下所示:

    @Autowired
    CookieServiceInterceptor CookieServiceInterceptor;
    @豆子
    公共地图接收器myInterceptor(){
    返回新的MappeInterceptor(null,cookieServiceInterceptor);
    }
    
    这个拦截器有一个缺陷,当请求被重定向(例如return 302)或失败(例如return 401)时,它无法添加samesite,而当SSO时,它会使我的应用程序失败。最后,我不得不使用Tomcat cookie,因为我没有将Tomcat嵌入我的springboot应用程序中。我补充说

    
    

    在我的应用程序的/META-INF下的context.xml中。它将为每个响应在set cookie头中添加SameSite属性。注意,自Tomcat 9.0.21和8.5.42以来,这种行为是可能的。根据

    的说法,这是不可能的。Spring会话中支持此功能:

    我想出了一个类似于罗恩的解决方案。但有一件重要的事情需要注意:

    用于跨站点使用的cookie必须指定
    SameSite=None;安全
    在第三方上下文中启用包含

    所以我包括了if ($scheme = http) { return 301 https://$http_host$request_uri; } proxy_cookie_path / "/; secure; SameSite=None";
    ResponseCookie cookie = ResponseCookie.from("cookiename", "cookieValue")
                .maxAge(3600) // one hour
                .domain("test.com")
                .sameSite("None")
                .secure(true)
                .path("/")
                .build();
     response.addHeader(HttpHeaders.SET_COOKIE, cookie.toString());