自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

開(kāi)發(fā) 前端 分布式
顧名思義,SharedObject的意思是可共享的對(duì)象。它的作用是如果一些對(duì)象你希望在不同的作用域配置中共享它們就把這些對(duì)象變成SharedObject,有點(diǎn)分布式對(duì)象的感覺(jué)。

[[378938]]

 1. 前言

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

  1. ApplicationContext context = http.getSharedObject(ApplicationContext.class); 
  2.     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ì)象也不是接口,而是某一類“可共享”的對(duì)象的統(tǒng)稱。

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

配置類的組織架構(gòu)

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

SharedObject 的注冊(cè)

SharedObject會(huì)以其Class類型為Key,實(shí)例為Value存儲(chǔ)到一個(gè)HashMap

注入AuthenticationManagerBuilder

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

還有一部分是在所有的HttpSecurityBuilder對(duì)象初始化時(shí)注冊(cè)的。它初始化和配置都是由SecurityConfigurer來(lái)完成的:

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

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

  1. private Map<Class<?>, Object> createSharedObjects() { 
  2.    Map<Class<?>, 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; 

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

SharedObject 的獲取和使用

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

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

 

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

 

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)。

 

責(zé)任編輯:武曉燕 來(lái)源: 碼農(nóng)小胖哥
相關(guān)推薦

2020-07-03 13:29:08

Redis集群哈希槽

2021-04-23 07:33:10

SpringSecurity單元

2021-04-19 07:33:04

WebSecuritySpringHttpSecurit

2021-05-31 07:18:46

SpringSecurity信息

2009-06-12 11:42:28

EJB分布式

2020-09-21 09:15:12

系統(tǒng)

2023-01-13 07:39:07

2019-08-05 07:58:01

分布式架構(gòu)系統(tǒng)

2019-10-10 09:16:34

Zookeeper架構(gòu)分布式

2019-11-22 09:40:40

SpringJava編程語(yǔ)言

2023-05-29 14:07:00

Zuul網(wǎng)關(guān)系統(tǒng)

2017-09-01 05:35:58

分布式計(jì)算存儲(chǔ)

2019-06-19 15:40:06

分布式鎖RedisJava

2023-05-05 06:13:51

分布式多級(jí)緩存系統(tǒng)

2021-03-10 09:54:06

Redis分布式

2022-04-08 11:08:17

分布式數(shù)據(jù)接口同步機(jī)制

2021-03-14 18:23:18

邊緣計(jì)算對(duì)象存儲(chǔ)分布式計(jì)算

2019-08-22 14:30:21

技術(shù)Redis設(shè)計(jì)

2020-07-15 16:50:57

Spring BootRedisJava

2023-10-26 18:10:43

分布式并行技術(shù)系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)