是否可以将相同站点属性添加到 Spring Security CSRF 的 .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFal
Posted
技术标签:
【中文标题】是否可以将相同站点属性添加到 Spring Security CSRF 的 .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())【英文标题】:Is it possible to add same-site attribute to Spring Security CSRF's .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) 【发布时间】:2020-05-19 05:36:48 【问题描述】:我的安全配置有以下一行:
...csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())...
每个请求都会发送一个 csrf cookie 给客户端。此 cookie 没有同站点属性集。是否也可以添加相同站点属性?我查看了该类中的一些方法,据我所知,没有关于额外属性的信息。
如何做到这一点?
【问题讨论】:
【参考方案1】:只是插话并遵循 NatFars 的回答,这个解决方案在 Kotlin 中特别简单,您可以委托给其他对象,而不必以 hacky 方式从原始对象复制代码:
class CookieCsrfTokenRepositoryWrapper(private val repo: CsrfTokenRepository): CsrfTokenRepository by repo
override fun saveToken(token: CsrfToken?, req: HttpServletRequest?, res: HttpServletResponse?)
repo.saveToken(token, req, res)
res?.getHeaders("Set-Cookie")?.toList()?.forEach
if(it.contains("XSRF") && !it.contains("SameSite"))
res.setHeader("Set-Cookie", "$it; SameSite=strict")
val repo = CookieCsrfTokenRepositoryWrapper(CookieCsrfTokenRepository.withHttpOnlyFalse())
关于 Kotlin 中的委托:https://kotlinlang.org/docs/reference/delegation.html
【讨论】:
【参考方案2】:不幸的是,从版本 4.0.1 开始,servlet-api
不允许您将Same-Site
属性添加到Cookie
。希望这会很快改变。
但与此同时,您可以提供自己的 CsrfTokenRepository
实现,而不是将 Cookie
添加到 HttpServletResponse
(因此受到 servlet-api 的 cookie 表示的限制),而是直接设置 cookie在 HTTP 标头中:
public class CustomCsrfTokenRepository implements CsrfTokenRepository
// implement other methods...
@Override
public void saveToken(CsrfToken token, HttpServletRequest request,
HttpServletResponse response)
// some version of this:
response.setHeader("Set-Cookie", "HttpOnly; SameSite=strict");
你可以看看CookieCsrfTokenRepository
来填补空白。
【讨论】:
以上是关于是否可以将相同站点属性添加到 Spring Security CSRF 的 .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFal的主要内容,如果未能解决你的问题,请参考以下文章
spring security3 动态从数据库中读取权限信息<sec:authorize>标签 url属性不起作用
如何在 Spring sec 中为组使用属性:hasAnyRole 的授权标签
spring boot 配置属性 之 spring.profiles.include