spring security认证的底层实现
一、官方認證圖
二、AuthenticationManager 、ProviderManager、AuthenticationProvider的關系
從上面分析中得知,AuthenticationManager 是認證的核心類,但實際上在底層真正認證時還離不開 ProviderManager 以及 AuthenticationProvider 。他們三者關系是樣的呢?
- AuthenticationManager 是一個認證管理器,它定義了 Spring Security 過濾器要執行認證操作。
- ProviderManager AuthenticationManager接口的實現類。Spring Security 認證時默認使用就是 ProviderManager。
- AuthenticationProvider 就是針對不同的身份類型執行的具體的身份認證。
ProviderManager 是 AuthenticationManager 的唯一實現,也是 Spring Security 默認使用實現。從這里不難看出默認情況下AuthenticationManager 就是一個ProviderManager。
弄清楚認證原理之后我們來看下具體認證時數據源的獲取。默認情況下 AuthenticationProvider 是由 DaoAuthenticationProvider 類來實現認證的,在DaoAuthenticationProvider 認證時又通過 UserDetailsService 完成數據源的校驗。他們之間調用關系如下:
總結: AuthenticationManager 是認證管理器,在 Spring Security 中有全局AuthenticationManager,也可以有局部AuthenticationManager。全局的AuthenticationManager用來對全局認證進行處理,局部的AuthenticationManager用來對某些特殊資源認證處理。當然無論是全局認證管理器還是局部認證管理器都是由 ProviderManger 進行實現。 每一個ProviderManger中都代理一個AuthenticationProvider的列表,列表中每一個實現代表一種身份認證方式。認證時底層數據源需要調用 UserDetailService 來實現。
三、如何配置全局AuthenticationManage
@Configuration public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {private final MyUserDetailService myUserDetailService;@Autowiredpublic WebSecurityConfigurer(MyUserDetailService myUserDetailService) {this.myUserDetailService = myUserDetailService;}// @Bean // public UserDetailsService userDetailsService() { // InMemoryUserDetailsManager userDetailsService = new InMemoryUserDetailsManager(); // 修改默認的用戶名密碼 // userDetailsService.createUser(User.withUsername("aaa").password("{noop}123").roles("admin").build()); // return userDetailsService; // }//springboot 對 security 默認配置中 在工廠中默認創建 AuthenticationManager // @Autowired // public void initialize(AuthenticationManagerBuilder builder) throws Exception { // 這里AuthenticationManagerBuilder是spring工廠中給我們創建好了的默認AuthenticationManager,拿到后就可以進行修改 // System.out.println("springboot 默認配置: " + builder); // }//自定義AuthenticationManager 推薦(會覆蓋spring工廠中的默認AuthenticationManager)并沒有在工廠中暴露出來@Overridepublic void configure(AuthenticationManagerBuilder builder) throws Exception {System.out.println("自定義AuthenticationManager: " + builder);builder.userDetailsService(myUserDetailService);}//作用: 用來將自定義AuthenticationManager在工廠中進行暴露,可以在任何位置注入@Override@Beanpublic AuthenticationManager authenticationManagerBean() throws Exception {return super.authenticationManagerBean();} } 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的spring security认证的底层实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020年中国视频内容电商行业白皮书
- 下一篇: SpringBoot升级到2.3.x后返