覃蘢偉 蘭全祥
Spring Security中設(shè)計(jì)模式的運(yùn)用淺析
覃蘢偉 蘭全祥
(攀枝花學(xué)院,四川 攀枝花 617000)
Spring Security作為Web開發(fā)中十分重要的安全框架之一,常被用于Web應(yīng)用的認(rèn)證和授權(quán)。為了進(jìn)一步了解Spring Security框架的設(shè)計(jì)和實(shí)現(xiàn),加深對(duì)常見(jiàn)設(shè)計(jì)模式的理解,文章詳細(xì)介紹了Spring Security框架中策略模式、代理模式、適配器模式、責(zé)任鏈模式、模板方法模式的運(yùn)用,對(duì)上述設(shè)計(jì)模式的概念、基本原理、作用等進(jìn)行描述,分析Spring Security中關(guān)鍵類庫(kù)在設(shè)計(jì)模式中承擔(dān)的作用及執(zhí)行流程,為開發(fā)人員提供一定的學(xué)習(xí)參考。
Spring Security;設(shè)計(jì)模式;認(rèn)證;授權(quán)
在Web應(yīng)用開發(fā)過(guò)程中,系統(tǒng)安全性和數(shù)據(jù)安全性是開發(fā)人員必須要考慮的,而Spring Security就是一個(gè)為企業(yè)應(yīng)用系統(tǒng)提供訪問(wèn)控制的安全框架。該框架的目的是在系統(tǒng)開發(fā)中減少編寫大量重復(fù)的安全控制方面的代碼,提高程序開發(fā)效率[1]。
在程序開發(fā)過(guò)程中,經(jīng)過(guò)長(zhǎng)時(shí)間的實(shí)踐,開發(fā)人員總結(jié)出了面臨一般問(wèn)題的解決方案,即設(shè)計(jì)模式。研究Spring Security框架中的設(shè)計(jì)模式,不僅能夠進(jìn)一步了解設(shè)計(jì)模式在開發(fā)中的運(yùn)用,還能深入了解Spring Security框架的安全認(rèn)證機(jī)制,能夠?yàn)榭蚣芎驮O(shè)計(jì)模式的學(xué)習(xí)者提供新的學(xué)習(xí)思路和學(xué)習(xí)參考。針對(duì)Spring Security框架的主要作用以及常用的設(shè)計(jì)模式,本文主要討論Spring Security框架中的策略模式、代理模式、適配器模式、責(zé)任鏈模式和模板方法模式的運(yùn)用。
Spring Security作為應(yīng)用程序開發(fā)中常用的安全框架,其最大的優(yōu)勢(shì)是能夠便捷、高效地完成認(rèn)證和授權(quán),且該框架能夠?yàn)殚_發(fā)者提供一個(gè)高度自定義的開發(fā)環(huán)境,開發(fā)者可以根據(jù)不同需求靈活、便捷地進(jìn)行配置。
Spring Security中的認(rèn)證是由AuthenticationManager接口來(lái)負(fù)責(zé)的,該接口的核心方法是Authentication authenticate (Authentication authentication)throws AuthenticationException,當(dāng)正常返回 Authentication 時(shí),表示認(rèn)證成功;當(dāng)拋出異常時(shí),則表示認(rèn)證失敗。
該接口的主要實(shí)現(xiàn)類為 ProviderManager,在該實(shí)現(xiàn)類中管理了眾多AuthenticationProvider實(shí)例。在一次完整的認(rèn)證流程中,Spring Security允許存在多個(gè)AuthenticationProvider用來(lái)實(shí)現(xiàn)多種不同的認(rèn)證方式,且都由 ProviderManager 進(jìn)行統(tǒng)一管理,認(rèn)證信息將被Authentication 的實(shí)現(xiàn)類進(jìn)行保存,且用戶信息將被Spring Security的SecurityContextHolder對(duì)象進(jìn)行保存。
在 Spring Security 的授權(quán)體系中,有兩個(gè)關(guān)鍵接口分別是AccessDecisionManager和AccessDecisionVoter。
當(dāng)用戶請(qǐng)求一個(gè)資源(通常是一個(gè)接口或者方法)時(shí),用戶的角色信息會(huì)被封裝成一個(gè)ConfigAttribute 對(duì)象。使用ConfigAttribute對(duì)象的getAttribute()方法可以獲得一個(gè)帶有“ROLE_”前綴的用戶角色信息。AccessDecisionVoter會(huì)根據(jù)用戶角色信息和所請(qǐng)求資源的 ConfigAttribute進(jìn)行比較,進(jìn)而投出贊成、反對(duì)或者棄權(quán)票。AccessDecisionManager作為訪問(wèn)決策管理器,最終將決定用戶的此次訪問(wèn)是否被允許。
Spring Security的核心原理是將若干個(gè)過(guò)濾器組成過(guò)濾器鏈,然后所有的Servlet請(qǐng)求經(jīng)過(guò)這些過(guò)濾器進(jìn)行認(rèn)證、授權(quán)等,從而保障程序的安全性。主要過(guò)濾器包括Username Password Authentication Filter過(guò)濾器(處理表單認(rèn)證信息)、Basic Authentication Filter過(guò)濾器(檢測(cè)和處理http basic認(rèn)證)、Other Security Filter過(guò)濾器、Exception Translation Filter過(guò)濾器(處理Access Denied Exception和Authentication Exception異常)和Filter Security Interceptor過(guò)濾器(授權(quán)并決定是否可以訪問(wèn)資源服務(wù))等[2],Spring Security主要過(guò)濾器如圖1所示。

圖1 Spring Security主要過(guò)濾器
Spring Security框架運(yùn)用了諸多設(shè)計(jì)模式,包括策略模式、代理模式、適配器模式、模板方法模式、責(zé)任鏈模式、建造者模式、觀察者模式、裝飾器模式等。本文將重點(diǎn)介紹策略模式、代理模式、適配器模式、責(zé)任鏈模式和模板方法模式在Spring Security中的運(yùn)用。
2.1.1 策略模式介紹
策略模式是一種行為型模式,它將對(duì)象和行為分開,將行為定義為一個(gè)接口,并將其作為抽象策略類(Strategy)。每一個(gè)不同的具體行為需要實(shí)現(xiàn)抽象策略類,并將其作為具體策略類(ConcreteStrategy),即不同的策略。除此之外,再由上下文類(Context)根據(jù)需求對(duì)不同的策略進(jìn)行選擇和替換[3]。
策略模式關(guān)注的是行為的選擇,即可以在不同的行為之間進(jìn)行替換。例如,在一個(gè)業(yè)務(wù)處理流程中有許多種方式可以完成該業(yè)務(wù),這些方式之間的區(qū)別僅在于解決方式不同,即不同的行為,可以使用策略模式讓上下文類(Context)動(dòng)態(tài)地選擇一種方式進(jìn)行執(zhí)行。
2.1.2 在Spring Security中的運(yùn)用
一般情況下,當(dāng)用戶登錄成功后,系統(tǒng)會(huì)保存用戶登錄信息。從信息安全的角度出發(fā),為了確保用戶信息只有當(dāng)前線程能夠訪問(wèn),通常會(huì)將當(dāng)前用戶信息和當(dāng)前線程進(jìn)行綁定,即將用戶信息存儲(chǔ)在當(dāng)前線程中。但是系統(tǒng)中難免會(huì)出現(xiàn)多線程的業(yè)務(wù),或是在某個(gè)具體的業(yè)務(wù)邏輯處理中需要開啟子線程,此時(shí)就需要每個(gè)子線程都能夠訪問(wèn)用戶信息。這時(shí),就出現(xiàn)了不同的用戶信息存儲(chǔ)策略,需要開發(fā)人員根據(jù)不同的需求選擇存儲(chǔ)策略。
Spring Security在解決用戶信息存儲(chǔ)的問(wèn)題上采用了策略模式。該框架定義了SecurityContextHolderStrategy接口作為抽象策略類,并實(shí)現(xiàn)了三種不同的具體存放策略以及作為上下文類的SecurityContextHolder,如圖2所示。

圖2 Spring Security中策略模式示意圖
Spring Security在SecurityContextHolder中定義了三個(gè)靜態(tài)常量,分別是MODE_THREADLOCAL、MODE_INHERITABLETHREADLOCAL、MODE_GLOBAL,并讓其與某一具體存放策略進(jìn)行對(duì)應(yīng),開發(fā)人員在開發(fā)過(guò)程中只需根據(jù)具體需求去選擇存放策略。
以MODE_THREADLOCAL所對(duì)應(yīng)的存儲(chǔ)策略為例,程序在啟動(dòng)過(guò)程中會(huì)先加載寫有該策略信息的配置文件,然后再運(yùn)行過(guò)程中根據(jù)所選策略來(lái)執(zhí)行ThreadLocalSecurityContextHolderStrategy中的具體實(shí)現(xiàn),該策略會(huì)通過(guò)ThreadLocal保存用戶信息。由于使用 ThreadLocal 創(chuàng)建的變量只能被當(dāng)前線程訪問(wèn),不能被其他線程訪問(wèn)和修改,從而確保了用戶信息安全。
2.2.1 代理模式介紹
代理模式是一種對(duì)象結(jié)構(gòu)型模式,它給某一個(gè)真實(shí)對(duì)象(委托類)提供一個(gè)代理對(duì)象(代理類)。為了確保代理類能夠?qū)崿F(xiàn)對(duì)委托類的代理,一般情況下需要兩個(gè)類共同實(shí)現(xiàn)公共接口,并由代理對(duì)象控制對(duì)真實(shí)對(duì)象的引用,從而控制對(duì)象的訪問(wèn)[4]。
代理類能夠?qū)ξ蓄愡M(jìn)行功能增強(qiáng)(包括功能的預(yù)處理和后置處理),由于代理類對(duì)象本身并不真正實(shí)現(xiàn)服務(wù),因此代理類對(duì)象需要與對(duì)應(yīng)的委托類對(duì)象進(jìn)行關(guān)聯(lián),當(dāng)需要提供服務(wù)時(shí),由代理類對(duì)象調(diào)用所關(guān)聯(lián)的委托類對(duì)象的相關(guān)方法來(lái)提供服務(wù)。代理模式就是在訪問(wèn)委托類對(duì)象時(shí)增加了一定程度的間接性,這樣在程序開發(fā)過(guò)程中,可以附加多種其他操作,如Spring Security框架中對(duì)密碼進(jìn)行加密、加密方法的判斷和選擇等。
2.2.2 在Spring Security中的運(yùn)用
為了保證用戶密碼安全,系統(tǒng)通常不會(huì)將用戶密碼以明文的方式存放在數(shù)據(jù)庫(kù)中,而是采用合適的加密方案對(duì)密碼進(jìn)行加密后再進(jìn)行存儲(chǔ)。Spring Security中定義一個(gè)PasswordEncoder接口,并提供了多個(gè)實(shí)現(xiàn)類來(lái)對(duì)應(yīng)不同的加密方案,方便開發(fā)者對(duì)密碼進(jìn)行加密,如圖3所示。

圖3 PasswordEncoder的接口及實(shí)現(xiàn)類
但是在系統(tǒng)運(yùn)行過(guò)程中,如果長(zhǎng)期使用單一的密碼加密方案可能會(huì)降低系統(tǒng)安全性,因此在開發(fā)過(guò)程中往往會(huì)在上述加密方案中進(jìn)行隨機(jī)選擇,讓數(shù)據(jù)庫(kù)中存放不同加密方案所加密的密文,以保障用戶信息的安全。由于用戶登錄時(shí)需要進(jìn)行密碼比對(duì),且登錄和注冊(cè)時(shí)需要使用相同的PasswordEncoder接口實(shí)現(xiàn)類,因此多種加密方案會(huì)對(duì)登錄校驗(yàn)造成困難,即在登錄校驗(yàn)時(shí)需要先判斷加密方案,然后再調(diào)用對(duì)應(yīng)加密方案的PasswordEncoder實(shí)現(xiàn)類去進(jìn)行密碼比對(duì)。
為了解決上述問(wèn)題,Spring Security采用代理模式對(duì)需要進(jìn)行比對(duì)的密碼進(jìn)行預(yù)處理,即判斷用戶密碼使用的加密方案,再進(jìn)行匹配。以BCryptPasswordEncoder加密方案為例,Spring Security定義了一個(gè)代理類DelegatingePasswordEncoder,該代理類實(shí)現(xiàn)了PasswordEncoder接口,然后在類中調(diào)用了委托類BCryptPasswordEncoder的matches方法,如圖4所示。

圖4 DelegatingePasswordEncode代理示意圖
具體代理流程:在委托類BCryptPasswordEncoder的matches方法中先對(duì)參數(shù)中的密文進(jìn)行解析,從而判斷出密碼的加密方案id。然后,根據(jù)加密方案id生成對(duì)應(yīng)的加密方案對(duì)象(PasswordEncoder實(shí)現(xiàn)類對(duì)象),再通過(guò)調(diào)用該對(duì)象的matches方法完成密碼比對(duì)。核心代碼如下:
public boolean matches(CharSequence rawPassword, String prefixEncodedPassword) {
if (rawPassword == null && prefixEncodedPassword == null) { return true; } else {
String id = this.extractId(prefixEncodedPassword);
PasswordEncoder delegate = (PasswordEncoder)this. idToPasswordEncoder.get(id);
if (delegate == null) {
return this.defaultPasswordEncoderForMatches.matches(rawPassword, prefixEncodedPassword);
} else {
String encodedPassword = this.extractEncodedPassword (prefixEncodedPassword);
return delegate.matches(rawPassword, encodedPassword);}}}
若系統(tǒng)中存在多種不同的密碼加密方案,采用代理模式可以在進(jìn)行密碼對(duì)比時(shí)對(duì)相應(yīng)方法進(jìn)行增強(qiáng),提前對(duì)密文和加密方案進(jìn)行判斷,提高開發(fā)效率。Spring Security將對(duì)PasswordEncoder各個(gè)實(shí)現(xiàn)類的訪問(wèn)操作交給代理對(duì)象DelegatingePasswordEncoder進(jìn)行,實(shí)現(xiàn)對(duì)不同加密方案的統(tǒng)一管理。
此外,Spring Security框架使用DelegatingFilterProxy將過(guò)濾器鏈鏈接到Web Filter中也是典型的代理模式。
2.3.1 適配器模式介紹
適配器模式屬于結(jié)構(gòu)型模式,一般用作兩個(gè)不兼容接口之間的橋梁。適配器模式主要包含Target(目標(biāo)抽象類,包含用戶所期望的接口)、Adaptee(被適配類,即被適配的角色)以及Adapter(適配器類)三個(gè)角色。雖然Adaptee中已經(jīng)存在滿足客戶需求的內(nèi)容,但是由于接口不匹配,因此需要通過(guò)Adapter對(duì)接口進(jìn)行轉(zhuǎn)換,即通過(guò)Adapter使Adaptee和Target進(jìn)行適配。
適配器模式的原理是讓Adapter實(shí)現(xiàn)目標(biāo)抽象類Target并關(guān)聯(lián)一個(gè)被適配類Adaptee對(duì)象,使得后二者產(chǎn)生聯(lián)系。由于Adapter結(jié)合了兩個(gè)接口的功能,因此該模式能夠?qū)⒁粋€(gè)接口轉(zhuǎn)換成客戶希望的另一個(gè)接口,使接口不兼容的那些類可以一起工作[5]。
2.3.2 在Spring Security中的運(yùn)用
在Spring Security中SecurityConfigurer是一個(gè)非常重要的角色,SecurityConfigurer主要用來(lái)對(duì)Spring Security中的過(guò)濾器進(jìn)行配置,從而實(shí)現(xiàn)對(duì)所有請(qǐng)求的控制。SecurityConfigurer具有一個(gè)重要的實(shí)現(xiàn)類WebSecurityConfigurer,該類目的是配置WebSecurity。然而,為了實(shí)現(xiàn)對(duì)WebSecurity的配置和初始化,需要使用HttpSecurity類的方法,即WebSecurityConfigurer這個(gè)目標(biāo)抽象類需要使用HttpSecurity中的內(nèi)容,但由于兩者之間不能直接進(jìn)行交互,因此引入了WebSecurityConfigerAdapter作為適配器,以使兩者能夠在一起工作。
Spring Security采用適配器模式,定義了一個(gè)WebSecurityConfigerAdapter適配器(適配器類),該類繼承WebSecurityConfigurer(目標(biāo)抽象類)并與HttpSecurity(適配者類)進(jìn)行關(guān)聯(lián),三者關(guān)系如圖5所示。

圖5 Spring Security中適配器模式關(guān)系示意圖
在WebSecurityConfigerAdapter中能夠?qū)ttpSecurity類的示例進(jìn)行初始化,同時(shí)實(shí)現(xiàn)對(duì)WebSecurity的配置,進(jìn)而完成WebSecurityConfiger所需業(yè)務(wù)需求,關(guān)鍵代碼如下。
public abstract class WebSecurityConfigurerAdapter implements WebSecurityConfigurer
/*省略其他成員變量*/
private HttpSecurity http;
protected final HttpSecurity getHttp() throws Exception {}//實(shí)現(xiàn)對(duì)HttpSecurity的初始化
public void init(WebSecurity web) throws Exception {
HttpSecurity http = this.getHttp();
//使用http完成WebSecurityConfiger所需業(yè)務(wù)
}
2.4.1 責(zé)任鏈模式介紹
責(zé)任鏈模式屬于行為型模式,它將命令的發(fā)出者和執(zhí)行者解耦。命令的發(fā)出者將命令發(fā)出后,命令到達(dá)責(zé)任鏈,并沿著責(zé)任鏈在不同的執(zhí)行者之間傳遞,最后由適當(dāng)?shù)膱?zhí)行者進(jìn)行處理。發(fā)出者無(wú)需關(guān)心命令由哪一個(gè)執(zhí)行者處理以及處理細(xì)節(jié),只需將命令發(fā)送到責(zé)任鏈上,實(shí)現(xiàn)將命令發(fā)出者和執(zhí)行者進(jìn)行分離,從而降低了他們之間的耦合度。
當(dāng)有多個(gè)執(zhí)行者可以處理同一個(gè)命令且無(wú)法確定最終會(huì)由哪一個(gè)或多個(gè)執(zhí)行者來(lái)進(jìn)行處理時(shí),在責(zé)任鏈模式中,這些執(zhí)行者將實(shí)現(xiàn)一個(gè)公共的Handler接口,并在該接口中定義了處理命令的方法和調(diào)用下一個(gè)處理者的方法。
2.4.2 在Spring Security中的運(yùn)用
在Spring Security中使用了諸多的過(guò)濾器來(lái)對(duì)請(qǐng)求進(jìn)行處理,這些過(guò)濾器都實(shí)現(xiàn)了一個(gè)公共的接口Filter,并在不同的實(shí)現(xiàn)類中重寫doFilter方法進(jìn)行不同功能的實(shí)現(xiàn),如圖6所示。
在進(jìn)行用戶登錄認(rèn)證時(shí),使用UsernamePasswordAuthenticationFilter 過(guò)濾器對(duì)表單攜帶的登錄信息進(jìn)行處理;在防止CSRF(Cross Site Request Forgery,跨域請(qǐng)求偽造)時(shí),使用CsrfFilter過(guò)濾器對(duì)所有post請(qǐng)求進(jìn)行驗(yàn)證;當(dāng)系統(tǒng)沒(méi)有在配置文件中指定登錄頁(yè)面時(shí),DefaultLoginPageGeneratingFilter過(guò)濾器會(huì)為系統(tǒng)生成一個(gè)默認(rèn)的登錄界面。但當(dāng)一個(gè)請(qǐng)求到達(dá)前,系統(tǒng)并不能提前預(yù)知應(yīng)該使用哪一個(gè)過(guò)濾器對(duì)請(qǐng)求進(jìn)行處理,因此Spring Security引入了過(guò)濾器鏈來(lái)解決這一問(wèn)題。

圖6 Spring Security中Filter接口實(shí)現(xiàn)示意圖
Spring Security采用責(zé)任鏈模式,定義了一個(gè)VirtualFilterChain 類,在其中聲明了 5 個(gè)全局屬性:originalChain 表示原生過(guò)濾器鏈(即Web Filter),additionalFilters 表示 Spring Security 中的過(guò)濾器鏈(存儲(chǔ)Filter的list集合);firewalledRequest 表示當(dāng)前請(qǐng)求;size 表示過(guò)濾器鏈中過(guò)濾器的個(gè)數(shù);currentPosition 則是遍歷過(guò)濾器鏈時(shí)的下標(biāo)。
當(dāng)currentPosition等于size時(shí),表示過(guò)濾器鏈已經(jīng)執(zhí)行完畢,此時(shí)會(huì)退出 Spring Security 過(guò)濾器鏈,并通過(guò)調(diào)用 originalChain.doFilter 進(jìn)入到原生過(guò)濾鏈方法中。反之,則依次從 additionalFilters 中取出過(guò)濾器nextFilter并調(diào)用其doFilter 方法。相關(guān)代碼如下:
public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException {
if (this.currentPosition == this.size) {
this.originalChain.doFilter(request, response);
} else {
++this.currentPosition;
Filter nextFilter = (Filter)this.additionalFilters.get (this.currentPosition - 1);
nextFilter.doFilter(request, response, this);
}}
Spring Security中運(yùn)用責(zé)任鏈模式,保障過(guò)濾器鏈中的每個(gè)過(guò)濾器都具有不同的職能并且互不相擾,使得每個(gè)過(guò)濾器都能獨(dú)立、逐個(gè)處理Servlet請(qǐng)求。
2.5.1 模板方法模式介紹
模板方法模式是一種行為型模式,將一個(gè)業(yè)務(wù)邏輯中的方法骨架作為一個(gè)模板方法,并將某些方法的具體實(shí)現(xiàn)延遲到子類中完成,使子類可以在不改變?cè)摌I(yè)務(wù)邏輯執(zhí)行順序的情況下更改某些方法的實(shí)現(xiàn)。
模板方法模式中的主要角色有抽象類(Abstract Class),該類負(fù)責(zé)給出算法的輪廓和骨架。抽象類由一個(gè)模板方法和若干基礎(chǔ)方法構(gòu)成,其中模板方法就是算法的骨架,并按照某種順序去調(diào)用基礎(chǔ)方法。當(dāng)存在多個(gè)業(yè)務(wù)具有相同邏輯,且業(yè)務(wù)處理順序基本一致時(shí),可以考慮模板方法模式。
2.5.2 在Spring Security中的運(yùn)用
在Spring Security中諸多功能都是基于過(guò)濾器鏈實(shí)現(xiàn)的,且這些過(guò)濾器鏈都是通過(guò)建造者類來(lái)進(jìn)行配置并創(chuàng)建的,工作流程都十分固定,主要包括初始化(init)、配置(config)、構(gòu)建(performBuild)。但由于這些過(guò)濾器鏈的方法內(nèi)部的實(shí)現(xiàn)都不盡相同,因此Spring Security通過(guò)模板方法來(lái)解決這一問(wèn)題。
Spring Security采用模板方法模式定義了一個(gè)AbstractConfiguredSecurityBuilder作為所有過(guò)濾器鏈建造者類的父類,并在父類中規(guī)定了工作流程doBuild()方法(即方法調(diào)用順序),并使用final修飾該方法,使得子類無(wú)法改變,從而讓所有的過(guò)濾器鏈都按照前置初始化(beforeInit)、初始化(init)、前置配置(beforeConfigure)、配置(Configure)、構(gòu)建(performBuild)的順序執(zhí)行建造者類中的方法。然后,這些過(guò)濾器鏈可以根據(jù)實(shí)際需求重寫performBuild()方法,關(guān)鍵代碼如下。
protected final O doBuild() throws Exception {
this.beforeInit();
this.init();
this.beforeConfigure();
this.configure();
O result = this.performBuild();
return result;
}
private void init() throws Exception { }
private void configure() throws Exception {}
protected abstract O performBuild() throws Exception{}
Spring Security中采用模板方法模式,將創(chuàng)建過(guò)濾器鏈的工作流程交由父類控制,而行為的實(shí)現(xiàn)(performBuild()方法)延遲到子類當(dāng)中,使得不同子類可以完成不同的實(shí)現(xiàn)。
設(shè)計(jì)模式的意義就是為程序開發(fā)提供解決方案,優(yōu)化代碼邏輯,使程序更易于維護(hù)、擴(kuò)展和服用。以Spring Security框架為例,理解框架中所運(yùn)用到的策略模式、代理模式、適配器模式、責(zé)任鏈模式、模板方法模式等設(shè)計(jì)模式,不僅能夠從主流框架中學(xué)習(xí)到程序設(shè)計(jì)和開發(fā)思想,關(guān)注信息系統(tǒng)安全性,考慮工程實(shí)踐對(duì)于社會(huì)的影響,還能夠進(jìn)一步了解設(shè)計(jì)模式的優(yōu)缺點(diǎn)及使用場(chǎng)景。理解、掌握設(shè)計(jì)模式原理,并能夠在合適的場(chǎng)景中使用設(shè)計(jì)模式是提高開發(fā)效率,增強(qiáng)代碼可維護(hù)性的主要途經(jīng)之一。
[1] 孫恩斯. Spring Security安全框架應(yīng)用研究[J]. 信息系統(tǒng)工程,2019(3): 72.
[2] 朱運(yùn)喬. 基于Spring Security認(rèn)證與授權(quán)的Web應(yīng)用與實(shí)現(xiàn)[J]. 電腦編程技巧與維護(hù),2020(11): 14-16.
[3] 許俊. 基于策略模式的存儲(chǔ)過(guò)程使用研究[J]. 四川職業(yè)技術(shù)學(xué)院學(xué)報(bào),2017,27(5): 147-150.
[4] 盧增寧. 設(shè)計(jì)模式及其在軟件設(shè)計(jì)中的應(yīng)用[J]. 信息與電腦(理論版),2020,32(16): 127-129.
[5] 高升,方英蘭,韓兵,等. 適配器與裝飾者模式思想在結(jié)構(gòu)化數(shù)據(jù)處理中的應(yīng)用[J]. 北方工業(yè)大學(xué)學(xué)報(bào),2020,32(2): 105-109,116.
Analysis of the Application of Design Patterns in Spring Security
As one of the most important security frameworks for Web development, Spring Security is often used for authentication and authorization of Web applications. In order to further understand the design and implementation of the Spring Security framework and deepen the understanding of common design patterns, this paper introduces the application of policy pattern, proxy pattern, adapter pattern, responsibility chain pattern and template method pattern in Spring Security framework in detail. This paper describes the concept, basic principle and function of the above design pattern, analyzes the role of key class libraries in Spring Security in the design pattern and the execution process, and provides certain reference for developers.
Spring Security; design patterns; authentication; authorization
TP393.08
A
1008-1151(2023)09-0001-05
2022-11-25
四川省高等學(xué)校第四批省級(jí)創(chuàng)新創(chuàng)業(yè)教育示范課程建設(shè)項(xiàng)目“Java Web應(yīng)用開發(fā)實(shí)訓(xùn)”;2022年全國(guó)大學(xué)生創(chuàng)新創(chuàng)業(yè)訓(xùn)練計(jì)劃項(xiàng)目(202211360019);2022年校級(jí)大學(xué)生創(chuàng)新創(chuàng)業(yè)訓(xùn)練計(jì)劃項(xiàng)目(2022cxcy147)。
覃蘢偉(2002-),男,四川自貢人,攀枝花學(xué)院學(xué)生,研究方向?yàn)檐浖_發(fā)。
蘭全祥(1990-),男,四川攀枝花人,攀枝花學(xué)院講師,碩士,從事計(jì)算機(jī)應(yīng)用研究工作。