根據應用程序的類型,可能需要采用策略來在用戶操作之間存儲安全上下文。 在典型的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