当前位置: 首页 > 科技观察

SpringSecurity实用干货:分布式对象SharedObject

时间:2023-03-12 00:15:20 科技观察

1。在前言中我们分析了上一篇AuthenticationManager的初始化细节,其中有一段代码引起了很多同学的注意:ApplicationContextcontext=http.getSharedObject(ApplicationContext.class);CaptchaAuthenticationProvidercaptchaAuthenticationProvider=context.getBean("captchaAuthenticationProvider",CaptchaAuthenticationProvider.class);Spring应用上下文对象ApplicationContext是直接从HttpSecurity对象中获取的。它是怎么做到的?SharedObject是什么概念?今天让我们来了解一下。2、SharedObject在SpringSecurity中,SharedObject既不是对象也不是接口,而是对某一类“可共享”对象的统称。顾名思义,SharedObject的意思是一个可共享的对象。它的作用是如果有些对象你想在不同的作用域配置中共享它们,就把这些对象变成SharedObject,有点像分布式对象。为了方便大家理解,下面是相关架构:配置类AbstractConfiguredSecurityBuilder或HttpSecurityBuilder的实现类的组织结构,具有操作SharedObject的能力。一种是注册SharedObject,另一种是获取SharedObject。SharedObject注册SharedObject会将其Class类型作为Key,实例作为Value存储到一个HashMap中,注入到AuthenticationManagerBuilder中。这里分享我们熟悉的AuthenticationManagerBuilder。另一部分在所有HttpSecurityBuilder对象初始化时注册。它的初始化和配置都是通过SecurityConfigurer来完成的:publicinterfaceSecurityConfigurer>{voidinit(Bbuilder)throwsException;voidconfigure(Bbuilder)throwsException;}以上两个方法分别用于初始化和配置HttpSecurityBuilder。比如大家熟知的WebSecurityConfigurerAdapter就是用来配置HttpSecurity的。在它的init方法中,我们可以找到相关的代码:);sharedObjects.put(UserDetailsS??ervice.class,userDetailsS??ervice());sharedObjects.put(ApplicationContext.class,context);sharedObjects.put(ContentNegotiationStrategy.class,contentNegotiationStrategy);sharedObjects.put(AuthenticationTrustResolver.class,trustResolver);returnssharedObjects;}这也是我能拿到文章开头的ApplicationContext的根本原因。SharedObject的获取和使用我们可以获取到哪些标示为SharedObject的类呢?SecurityConfigurer的实现有很多,这些实现用来配置一些具体的认证授权相关的功能。例如,OAuth2ClientConfigurer用于配置OAuth2客户端。它将一些常用的对象设置为SharedObject:returnthis;}当你需要在HttpSecurity配置的其他地方使用ClientRegistrationRepository时,可以像文章开头一样直接通过getSharedObject获取,而不需要写一些获取方法。3.总结SharedObject是SpringSecurity提供的一个非常有用的功能。如果你需要在不同的地方复用一个对象,你可以将它注册为SharedObject,甚至可以像一开始那样直接注入SpringIoC来获取。该特性简化了配置,提高了代码可读性,为SpringSecurity的DSL特性奠定了基础。本文转载自微信公众号“码农小胖哥”,可通过以下二维码关注。转载本文请联系码农小胖公众号。