新聞中心
Spring Security 實(shí)戰(zhàn)干貨:分布式對(duì)象SharedObject
作者:碼農(nóng)小胖哥 2021-01-28 09:50:29
開(kāi)發(fā)
前端
分布式 顧名思義,SharedObject的意思是可共享的對(duì)象。它的作用是如果一些對(duì)象你希望在不同的作用域配置中共享它們就把這些對(duì)象變成SharedObject,有點(diǎn)分布式對(duì)象的感覺(jué)。

成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括武穴網(wǎng)站建設(shè)、武穴網(wǎng)站制作、武穴網(wǎng)頁(yè)制作以及武穴網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,武穴網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到武穴省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
1. 前言
在上一篇我們對(duì)AuthenticationManager的初始化的細(xì)節(jié)進(jìn)行了分析,其中里面有一段代碼引起了不少同學(xué)的注意:
- ApplicationContext context = http.getSharedObject(ApplicationContext.class);
- CaptchaAuthenticationProvider captchaAuthenticationProvider = context.getBean("captchaAuthenticationProvider", CaptchaAuthenticationProvider.class);
上面直接從HttpSecurity對(duì)象中獲取到Spring的應(yīng)用上下文對(duì)象ApplicationContext,它是怎么做到的呢?SharedObject又是個(gè)什么概念?今天就來(lái)搞清楚這個(gè)問(wèn)題。
2. SharedObject
在Spring Security中SharedObject既不是對(duì)象也不是接口,而是某一類(lèi)“可共享”的對(duì)象的統(tǒng)稱(chēng)。
顧名思義,SharedObject的意思是可共享的對(duì)象。它的作用是如果一些對(duì)象你希望在不同的作用域配置中共享它們就把這些對(duì)象變成SharedObject,有點(diǎn)分布式對(duì)象的感覺(jué)。為了更加便于你理解,下面是相關(guān)的體系結(jié)構(gòu):
配置類(lèi)的組織架構(gòu)
AbstractConfiguredSecurityBuilder或者HttpSecurityBuilder的實(shí)現(xiàn)類(lèi)才具有操作SharedObject的能力。一種是注冊(cè)SharedObject,另一種是獲取SharedObject。
SharedObject 的注冊(cè)
SharedObject會(huì)以其Class類(lèi)型為Key,實(shí)例為Value存儲(chǔ)到一個(gè)HashMap
注入AuthenticationManagerBuilder
我們熟知的AuthenticationManagerBuilder在這里被共享。
還有一部分是在所有的HttpSecurityBuilder對(duì)象初始化時(shí)注冊(cè)的。它初始化和配置都是由SecurityConfigurer來(lái)完成的:
- public interface SecurityConfigurer
> { - void init(B builder) throws Exception;
- void configure(B builder) throws Exception;
- }
上面兩個(gè)方法分別用來(lái)初始化和配置HttpSecurityBuilder。比如我們熟知的WebSecurityConfigurerAdapter就是用來(lái)配置HttpSecurity的,在其init方法中我們可以找到相關(guān)的代碼:
- private Map
, Object> createSharedObjects() { - Map
, Object> sharedObjects = new HashMap<>(); - sharedObjects.putAll(localConfigureAuthenticationBldr.getSharedObjects());
- sharedObjects.put(UserDetailsService.class, userDetailsService());
- sharedObjects.put(ApplicationContext.class, context);
- sharedObjects.put(ContentNegotiationStrategy.class, contentNegotiationStrategy);
- sharedObjects.put(AuthenticationTrustResolver.class, trustResolver);
- return sharedObjects;
- }
這也是我在文章開(kāi)頭可以獲取到ApplicationContext的根本原因。
SharedObject 的獲取和使用
我們能獲取到哪些被標(biāo)記為SharedObject類(lèi)呢?SecurityConfigurer有很多實(shí)現(xiàn),這些實(shí)現(xiàn)都是用來(lái)配置一些特定的同認(rèn)證授權(quán)相關(guān)的功能的。比如OAuth2ClientConfigurer用來(lái)配置 OAuth2 客戶端的,它里面就將常用的一些對(duì)象設(shè)置為SharedObject:
- public OAuth2ClientConfigurer clientRegistrationRepository(ClientRegistrationRepository clientRegistrationRepository) {
- Assert.notNull(clientRegistrationRepository, "clientRegistrationRepository cannot be null");
- this.getBuilder().setSharedObject(ClientRegistrationRepository.class, clientRegistrationRepository);
- return this;
- }
當(dāng)你在HttpSecurity的配置中的其它地方需要用到ClientRegistrationRepository時(shí),你可以直接通過(guò)getSharedObject獲取,就像文章開(kāi)頭一樣,而不用在去寫(xiě)一些獲取方法了。
3. 總結(jié)
SharedObject是Spring Security提供的一個(gè)非常好用的功能,如果你在不同的地方需要對(duì)一個(gè)對(duì)象重復(fù)使用就可以將它注冊(cè)為SharedObject,甚至直接注入Spring IoC像開(kāi)頭那樣獲取就可以了。這個(gè)特性能夠簡(jiǎn)化配置,提高代碼的可讀性,也為Spring Security的DSL特性打下了基礎(chǔ)。
本文轉(zhuǎn)載自微信公眾號(hào)「碼農(nóng)小胖哥」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系碼農(nóng)小胖哥公眾號(hào)。
當(dāng)前題目:Spring Security 實(shí)戰(zhàn)干貨:分布式對(duì)象SharedObject
網(wǎng)頁(yè)地址:http://www.dlmjj.cn/article/dhcheei.html


咨詢
建站咨詢
