日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring security认证的底层实现

發(fā)布時間:2025/3/15 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring security认证的底层实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、官方認證圖

  • 發(fā)起認證請求,請求中攜帶用戶名、密碼,該請求會被UsernamePasswordAuthenticationFilter 攔截
  • 在UsernamePasswordAuthenticationFilter的attemptAuthentication方法中將請求中用戶名和密碼,封裝為Authentication對象,并交給AuthenticationManager 進行認證
  • 認證成功,將認證信息存儲到 SecurityContextHodler 以及調(diào)用記住我(如有開啟)等,并回調(diào) AuthenticationSuccessHandler 處理
  • 認證失敗,清除 SecurityContextHodler 以及記住我中信息(如有開啟),回調(diào) AuthenticationFailureHandler 處理
  • 二、AuthenticationManager 、ProviderManager、AuthenticationProvider的關(guān)系

    從上面分析中得知,AuthenticationManager 是認證的核心類,但實際上在底層真正認證時還離不開 ProviderManager 以及 AuthenticationProvider 。他們?nèi)哧P(guān)系是樣的呢?

    • AuthenticationManager 是一個認證管理器,它定義了 Spring Security 過濾器要執(zhí)行認證操作。
    • ProviderManager AuthenticationManager接口的實現(xiàn)類。Spring Security 認證時默認使用就是 ProviderManager。
    • AuthenticationProvider 就是針對不同的身份類型執(zhí)行的具體的身份認證。


    ProviderManager 是 AuthenticationManager 的唯一實現(xiàn),也是 Spring Security 默認使用實現(xiàn)。從這里不難看出默認情況下AuthenticationManager 就是一個ProviderManager。

  • 在 Spring Seourity 中,允許系統(tǒng)同時支持多種不同的認證方式,例如同時支持用戶名/密碼認證、ReremberMe 認證、手機號碼動態(tài)認證等,而不同的認證方式對應(yīng)了不同的 AuthenticationProvider,所以一個完整的認證流程可由多個AuthenticationProvider 來提供。
  • 多個 AuthenticationProvider 將組成一個列表,這個列表將由 ProviderManager代理。換句話說,在ProviderManager 中存在一個 AuthenticationProvider 列表,在ProviderManager 中遍歷列表中的每一個 AuthenticationProvider 去執(zhí)行身份認證,最終得到認證結(jié)果。
  • ProviderManager 本身也可以再配置一個 AuthenticationManager 作為 parent,這樣當(dāng)ProviderManager 認證失敗之后,就可以進入到 parent中再次進行認證理論上來說,ProviderManager 的 parent 可以是任意類型的 AuthenticationManager,但是通常都是由 ProviderManager 來扮演 parent 的角色,也就是ProviderManager 是 ProviderManager 的 parent。
  • ProviderManager 本身也可以有多個,多個ProviderManager 共用同一個parent。有時,一個應(yīng)用程序有受保護資源的邏輯組(例如,所有符合路徑模式的網(wǎng)絡(luò)資源,如/api/**),每個組可以有自己的專用 AuthenticationManager。通常,每個組都是一個ProviderManager,它們共享一個父級。然后,父級是一種 全局資源,作為所有提供者的后備資源。
  • 弄清楚認證原理之后我們來看下具體認證時數(shù)據(jù)源的獲取。默認情況下 AuthenticationProvider 是由 DaoAuthenticationProvider 類來實現(xiàn)認證的,在DaoAuthenticationProvider 認證時又通過 UserDetailsService 完成數(shù)據(jù)源的校驗。他們之間調(diào)用關(guān)系如下:

    總結(jié): AuthenticationManager 是認證管理器,在 Spring Security 中有全局AuthenticationManager,也可以有局部AuthenticationManager。全局的AuthenticationManager用來對全局認證進行處理,局部的AuthenticationManager用來對某些特殊資源認證處理。當(dāng)然無論是全局認證管理器還是局部認證管理器都是由 ProviderManger 進行實現(xiàn)。 每一個ProviderManger中都代理一個AuthenticationProvider的列表,列表中每一個實現(xiàn)代表一種身份認證方式。認證時底層數(shù)據(jù)源需要調(diào)用 UserDetailService 來實現(xiàn)。

    三、如何配置全局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 默認配置中 在工廠中默認創(chuàng)建 AuthenticationManager // @Autowired // public void initialize(AuthenticationManagerBuilder builder) throws Exception { // 這里AuthenticationManagerBuilder是spring工廠中給我們創(chuàng)建好了的默認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位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

    總結(jié)

    以上是生活随笔為你收集整理的spring security认证的底层实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。