最基本的对象是`SecurityContextHolder`。 这是我们存储应用程序当前安全上下文的详细信息的地方,其中包括当前使用该应用程序的主体的详细信息。 默认情况下,`SecurityContextHolder`使用`ThreadLocal`来存储这些详细信息,这意味着安全上下文始终可用于同一执行线程中的方法,即使安全上下文未作为这些方法的参数显式传递。 如果在处理当前主体的请求之后注意清除线程,以这种方式使用ThreadLocal是非常安全的。 当然,Spring Security会自动为您解决这个问题,因此无需担心。
某些应用程序并不完全适合使用`ThreadLocal`,因为它们使用线程的特定方式。 例如,Swing客户端可能希望Java虚拟机中的所有线程都使用相同的安全上下文。 `SecurityContextHolder`可以在启动时配置策略,以指定您希望如何存储上下文。 对于独立应用程序,您将使用`SecurityContextHolder.MODE_GLOBAL`策略。 其他应用程序可能希望安全线程生成的线程也采用相同的安全标识。 这是通过使用`SecurityContextHolder.MODE_INHERITABLETHREADLOCAL`实现的。 您可以通过两种方式从默认的`SecurityContextHolder.MODE_THREADLOCAL`更改模式。 第一个是设置系统属性,第二个是在`SecurityContextHolder`上调用静态方法。 大多数应用程序不需要更改默认值,但如果这样做,请查看JavaDoc for `SecurityContextHolder`以了解更多信息。
## 获取有关当前用户的信息
在`SecurityContextHolder`中,我们存储当前与应用程序交互的主体的详细信息。 Spring Security使用`Authentication`对象来表示此信息。 您通常不需要自己创建`Authentication`对象,但用户查询`Authentication`对象是相当常见的。 您可以使用以下代码块(从应用程序的任何位置)获取当前经过身份验证的用户的名称,例如:
~~~
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {
String username = ((UserDetails)principal).getUsername();
} else {
String username = principal.toString();
}
~~~
调用`getContext()`返回的对象是`SecurityContext`接口的一个实例。 这是保存在线程本地存储中的对象。 正如我们将在下面看到的,Spring Security中的大多数身份验证机制都会返回`UserDetails`的实例作为主体。
- 架构
- 9.技术概述
- 9.1 运行环境
- 9.2 核心组件
- 9.2.1 SecurityContextHolder, SecurityContext and Authentication Objects
- 9.2.2 The UserDetailsService
- 9.2.3 GrantedAuthority
- 9.2.4 总结
- 9.3 验证
- 9.3.1 在Spring Security中验证是什么
- 9.3.2 直接设置SecurityContextHolder内容
- 9.4 web应用中的验证
- 9.4.1 ExceptionTranslationFilter
- 9.4.2 AuthenticationEntryPoint
- 9.4.3 验证机制
- 9.4.4 在请求之间存储SecurityContext
- 9.5 Spring Security中的访问控制(授权)
- 9.5.1 Security and AOP Advice
- 9.5.2 Secure Objects and the AbstractSecurityInterceptor
- 什么是配置属性
- RunAsManager
- AfterInvocationManager
- 扩展安全对象模型
- 9.6 本地化
- 10 核心服务
- 10.1 The AuthenticationManager, ProviderManager and AuthenticationProvider
- 10.1.1 成功验证时擦除凭据
- 10.1.2 DaoAuthenticationProvider
- 10.2 UserDetailsService实现
- 10.2.1 In-Memory Authentication
- 10.2.2 JdbcDaoImpl
- Authority Groups
- 10.3 Password Encoding
- 10.3.1 密码发展史
- 10.3.2 DelegatingPasswordEncoder
- 密码存储格式
- 密码编码
- 密码比对
- 入门体验
- 排除故障
- 10.3.3 BCryptPasswordEncoder
- 10.3.4 Pbkdf2PasswordEncoder
- 10.3.5 SCryptPasswordEncoder
- 10.3.6 其他PasswordEncoders
- 10.4 Jackson的支持
- 11 测试方法安全
- 12 集成spring mvc测试
- 13 webflux支持
- 14 安全过滤器链
- 14.1 DelegatingFilterProxy
- 14.2 FilterChainProxy
- 14.2.1 绕过过滤链
- 14.3 过滤器顺序
- 14.4 匹配请求和http防火墙
- 14.5 与其他基于过滤器的框架一起使用
- 14.6 Advanced Namespace Configuration
- 15. 核心的安全过滤器
- 15.1 FilterSecurityInterceptor
- 15.2 ExceptionTranslationFilter
- 15.3 SecurityContextPersistenceFilter
- 15.4 UsernamePasswordAuthenticationFilter