ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
实际上,Spring Security并不介意如何将`Authentication`对象放在`SecurityContextHolder`中。唯一的关键要求是,在`AbstractSecurityInterceptor`(我们将在后面看到更多信息)需要授权用户操作之前,`SecurityContextHolder`包含一个代表主体的`Authentication`. 您可以(以及许多用户)编写自己的过滤器或MVC控制器,以提供与不基于Spring Security的身份验证系统的互操作性。例如,您可能正在使用容器管理的身份验证,这使得当前用户可以从ThreadLocal或JNDI位置使用。或者您可能会为拥有传统专有身份验证系统的公司工作,这是一个您无法控制的企业“标准”。在这种情况下,很容易让Spring Security工作,并且仍然提供授权功能。您需要做的就是编写一个过滤器(或等效的),从一个位置读取第三方用户信息,构建一个特定于Spring Security的`Authentication`对象,并将其放入`SecurityContextHolder`。在这种情况下,您还需要考虑内置身份验证基础结构通常会自动处理的事情。例如,在将响应写入客户端脚注之前,您可能需要先强制创建一个HTTP会话来缓存请求之间的上下文:[一旦提交响应,就无法创建会话。 如果您想知道如何在现实世界的示例中实现`AuthenticationManager`,我们将在核心服务章节中查看它。