💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
根据应用程序的类型,可能需要采用策略来在用户操作之间存储安全上下文。 在典型的Web应用程序中,用户登录一次,然后由其会话ID标识。 服务器缓存持续时间会话的主体信息。 在Spring Security中,在请求之间存储`SecurityContext`的责任属于`SecurityContextPersistenceFilter`,它默认将上下文存储为HTTP请求之间的`HttpSession`属性。 它把每个请求的安全上下文存储在`SecurityContextHolder`,并且至关重要的是,`在请求完成时清除SecurityContextHolder`。 出于安全目的,您不应直接与`HttpSession`交互。 没有理由这样做 - 应该使用`SecurityContextHolder`来代替。 许多其他类型的应用程序(例如,无状态RESTful Web服务)不使用HTTP会话,并将在每个请求上重新进行身份验证。 但是,在链中包含`SecurityContextPersistenceFilter`以确保在每次请求后清除`SecurityContextHolder`仍然很重要。 >在一个会话中接收并发请求的应用程序中(浏览器多个ajax请求),将在线程之间共享相同的`SecurityContext`实例。 即使正在使用`ThreadLocal`,它也是从`HttpSession`为每个线程检索的相同实例。 如果您希望临时更改运行线程的上下文,则会产生影响。 如果您只使用`SecurityContextHolder.getContext()`,并在返回的上下文对象上调用`setAuthentication(anAuthentication)`,则`Authentication`对象将在共享同一SecurityContext实例的所有并发线程中更改。 您可以自定义`SecurityContextPersistenceFilter`的行为,以便为每个请求创建一个全新的`SecurityContext`,从而防止一个线程中的更改影响另一个线程。 或者,您可以在临时更改上下文的位置创建新实例。 `SecurityContextHolder.createEmptyContext()`方法始终返回新的上下文实例。