根据应用程序的类型,可能需要采用策略来在用户操作之间存储安全上下文。 在典型的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()`方法始终返回新的上下文实例。
- 架构
- 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