[toc]

## 1.接收請求
Spring安全性有一系列/過濾器鏈。 因此,當請求到來時,它將通過一系列過濾器進行身份驗證和授權。 當存在用戶認證請求時,它也將像往常一樣通過過濾器鏈,直到它根據認證機制/模型找到相關的認證過濾器。
例如: -
HTTP基本身份驗證請求通過過濾器鏈直到它到達BasicAuthenticationFilter。
HTTP摘要式身份驗證請求通過過濾器鏈,直到它到達DigestAuthenticationFilter。
登錄表單提交請求(登錄表單身份驗證請求)通過過濾器鏈直到它到達UsernamePasswordAuthenticationFilter。
x509身份驗證請求通過過濾器鏈直到它到達X509AuthenticationFilter等...
## 2.根據用戶憑據創建AuthenticationToken
一旦相關的AuthenticationFilter收到身份驗證請求,它就會從收到的請求中提取用戶名和密碼(大多數身份驗證機制都需要用戶名和密碼)。 之后,它會根據提取的用戶憑據創建一個Authentication對象。
如果提取的憑據是用戶名和密碼,則將使用提取/找到的用戶名和密碼創建UsernamePasswordAuthenticationToken。
## 3.創建的AuthenticationToken委派給AuthenticationManagager
創建UsernamePasswordAuthenticationToken對象后,它將用于調用AuthenticationManager的authenticate方法。 AuthenticationManager只是一個接口,實際的實現是ProviderManager。
~~~
public interface AuthenticationManager
{
Authentication authenticate(Authentication authentication)throws AuthenticationException;
}
~~~
ProviderManager有一個配置的AuthenticationProvider列表,應該用于驗證用戶請求。 ProviderManager將遍歷每個提供的AuthenticationProvider,并嘗試根據傳遞的Authentication Object對用戶進行身份驗證(例如: - UsernamePasswordAuthenticationToken)
## 4.嘗試使用AuthenticationProvider列表進行身份驗證
AuthenticationProvider嘗試使用提供的身份驗證對象對用戶進行身份驗證。
~~~
public interface AuthenticationProvider {
Authentication authenticate(Authentication authentication) throws AuthenticationException;
boolean supports(Class<?> authentication);
}
~~~
以下是框架附帶的一些現有身份驗證程序:
* CasAuthenticationProvider
* JaasAuthenticationProvider
* DaoAuthenticationProvider
* OpenIDAuthenticationProvider
* RememberMeAuthenticationProvider
* LdapAuthenticationProvider
## 5.需要UserDetailsService嗎
一些AuthenticationProvider可以使用UserDetailsService根據用戶名檢索用戶詳細信息。 (例如: - DaoAuthenticationProvider)
~~~
public interface UserDetailsService
{
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}
~~~
## 6和7. UserDetails 還是 User Object?
UserDetailsService將根據用戶名檢索UserDetails(實際實現是User)。
## 8.Authentication 對象 還是 AuthenticationException?
如果用戶成功通過身份驗證,則將返回完全填充的Authentication對象。 否則將拋出AuthenticationException。
**完全填充的驗證對象**
經過身份驗證 - 是的
授權列表
用戶憑據(僅限用戶名)
如果拋出任何AuthenticationException,那將由支持身份驗證機制的已配置AuthenticationEntryPoint處理。
## 9.驗證完成!
AuthenticationManager將獲取的完全填充的Authentication對象返回到相關的Authentication 過濾器。
## 10.在SecurityContext中設置Authentication對象
然后,相關的AuthenticationFilter會將獲取的身份驗證對象存儲在SecurityContext中,以供將來過濾器使用。 (用于授權過濾器)
`SecurityContextHolder.getContext().setAuthentication(authentication);`
希望這將有助于您在一定程度上深入了解Spring Security身份驗證體系結構。
- 架構
- 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