日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
Spring Security 實戰(zhàn)干貨:分布式對象SharedObject

Spring Security 實戰(zhàn)干貨:分布式對象SharedObject

作者:碼農小胖哥 2021-01-28 09:50:29

開發(fā)

前端

分布式 顧名思義,SharedObject的意思是可共享的對象。它的作用是如果一些對象你希望在不同的作用域配置中共享它們就把這些對象變成SharedObject,有點分布式對象的感覺。

成都創(chuàng)新互聯(lián)公司服務項目包括武穴網站建設、武穴網站制作、武穴網頁制作以及武穴網絡營銷策劃等。多年來,我們專注于互聯(lián)網行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯(lián)網行業(yè)的解決方案,武穴網站推廣取得了明顯的社會效益與經濟效益。目前,我們服務的客戶以成都為中心已經輻射到武穴省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!

 1. 前言

在上一篇我們對AuthenticationManager的初始化的細節(jié)進行了分析,其中里面有一段代碼引起了不少同學的注意:

  
 
 
 
  1. ApplicationContext context = http.getSharedObject(ApplicationContext.class); 
  2.     CaptchaAuthenticationProvider captchaAuthenticationProvider = context.getBean("captchaAuthenticationProvider", CaptchaAuthenticationProvider.class); 

上面直接從HttpSecurity對象中獲取到Spring的應用上下文對象ApplicationContext,它是怎么做到的呢?SharedObject又是個什么概念?今天就來搞清楚這個問題。

2. SharedObject

在Spring Security中SharedObject既不是對象也不是接口,而是某一類“可共享”的對象的統(tǒng)稱。

顧名思義,SharedObject的意思是可共享的對象。它的作用是如果一些對象你希望在不同的作用域配置中共享它們就把這些對象變成SharedObject,有點分布式對象的感覺。為了更加便于你理解,下面是相關的體系結構:

配置類的組織架構

AbstractConfiguredSecurityBuilder或者HttpSecurityBuilder的實現(xiàn)類才具有操作SharedObject的能力。一種是注冊SharedObject,另一種是獲取SharedObject。

SharedObject 的注冊

SharedObject會以其Class類型為Key,實例為Value存儲到一個HashMap

注入AuthenticationManagerBuilder

我們熟知的AuthenticationManagerBuilder在這里被共享。

還有一部分是在所有的HttpSecurityBuilder對象初始化時注冊的。它初始化和配置都是由SecurityConfigurer來完成的:

  
 
 
 
  1. public interface SecurityConfigurer> { 
  2.  
  3.    void init(B builder) throws Exception; 
  4.  
  5.    void configure(B builder) throws Exception; 

上面兩個方法分別用來初始化和配置HttpSecurityBuilder。比如我們熟知的WebSecurityConfigurerAdapter就是用來配置HttpSecurity的,在其init方法中我們可以找到相關的代碼:

  
 
 
 
  1. private Map, Object> createSharedObjects() { 
  2.    Map, Object> sharedObjects = new HashMap<>(); 
  3.    sharedObjects.putAll(localConfigureAuthenticationBldr.getSharedObjects()); 
  4.    sharedObjects.put(UserDetailsService.class, userDetailsService()); 
  5.    sharedObjects.put(ApplicationContext.class, context); 
  6.    sharedObjects.put(ContentNegotiationStrategy.class, contentNegotiationStrategy); 
  7.    sharedObjects.put(AuthenticationTrustResolver.class, trustResolver); 
  8.    return sharedObjects; 

這也是我在文章開頭可以獲取到ApplicationContext的根本原因。

SharedObject 的獲取和使用

我們能獲取到哪些被標記為SharedObject類呢?SecurityConfigurer有很多實現(xiàn),這些實現(xiàn)都是用來配置一些特定的同認證授權相關的功能的。比如OAuth2ClientConfigurer用來配置 OAuth2 客戶端的,它里面就將常用的一些對象設置為SharedObject:

  
 
 
 
  1. public OAuth2ClientConfigurer clientRegistrationRepository(ClientRegistrationRepository clientRegistrationRepository) { 
  2.    Assert.notNull(clientRegistrationRepository, "clientRegistrationRepository cannot be null"); 
  3.    this.getBuilder().setSharedObject(ClientRegistrationRepository.class, clientRegistrationRepository); 
  4.    return this; 

當你在HttpSecurity的配置中的其它地方需要用到ClientRegistrationRepository時,你可以直接通過getSharedObject獲取,就像文章開頭一樣,而不用在去寫一些獲取方法了。

3. 總結

SharedObject是Spring Security提供的一個非常好用的功能,如果你在不同的地方需要對一個對象重復使用就可以將它注冊為SharedObject,甚至直接注入Spring IoC像開頭那樣獲取就可以了。這個特性能夠簡化配置,提高代碼的可讀性,也為Spring Security的DSL特性打下了基礎。

本文轉載自微信公眾號「碼農小胖哥」,可以通過以下二維碼關注。轉載本文請聯(lián)系碼農小胖哥公眾號。


名稱欄目:Spring Security 實戰(zhàn)干貨:分布式對象SharedObject
標題URL:http://www.5511xx.com/article/dhcheei.html