Cookies Spring Security中会话cookie的相同站点标志
可以在Spring Security中设置标志吗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
如果没有,是否在路线图上添加支持?一些浏览器(如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”。 我尝试了几种方法来满足这一要求,包括:
不幸的是,上面没有一个能像预期的那样添加相同的内容
@组件
公共类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());