在使用 Spring Boot 编写的 rest API 上使用基于无状态令牌的身份验证时,我看到了一些奇怪的行为。
客户端在每个请求中都包含一个 JWT 令牌,并且我编写的扩展 GenericFilterBean 的自定义过滤器使用以下内容将基于令牌中的声明的身份验证对象添加到安全上下文中:
SecurityContextHolder.getContext().setAuthentication(authentication);
并在处理请求后清除上下文:
SecurityContextHolder.getContext().setAuthentication(null);
但是,当我开发的简单应用程序执行一系列操作时,我有时会发现安全上下文设置不正确 - 有时它对于提供令牌的请求为空。过滤器被正确调用,setAuthencation() 也被调用,但请求身份验证失败,并抛出 403 denied。
如果我通过将会话创建策略设置为 STATELESS 来明确关闭任何 http 会话管理,则此行为将停止。
有什么想法可以在这里发生吗?是否以某种方式在处理请求的线程之间共享安全上下文?