国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于JWT的分布式系統(tǒng)認(rèn)證授權(quán)機(jī)制設(shè)計(jì)和實(shí)現(xiàn)

2022-08-31 03:13:20張黎娜梁伍七
關(guān)鍵詞:服務(wù)端過(guò)濾器客戶(hù)端

童 敏,張黎娜,梁伍七

(安徽開(kāi)放大學(xué) 信息與工程學(xué)院,安徽 合肥 230022)

微服務(wù)作為一種新的軟件架構(gòu)模式,將系統(tǒng)業(yè)務(wù)功能進(jìn)行細(xì)粒度的劃分。其功能模塊被稱(chēng)為服務(wù),每個(gè)服務(wù)可獨(dú)立部署并運(yùn)行在其獨(dú)立的進(jìn)程中,服務(wù)間則采用輕量級(jí)的通信機(jī)制進(jìn)行溝通[1-2]。和傳統(tǒng)的面向服務(wù)的架構(gòu)(Service Orienented Architechture,SOA)相比,微服務(wù)具有更高的靈活性、可實(shí)施性和可擴(kuò)展性,是一種可獨(dú)立測(cè)試、部署和運(yùn)行的軟件架構(gòu)模式,在SOA的基礎(chǔ)上融入了組件化思想和領(lǐng)域建模思想。微服務(wù)架構(gòu)將軟件整體功能分解成多個(gè)服務(wù),分別由不同類(lèi)別的服務(wù)器進(jìn)行支持[3]。可以直觀地將微服務(wù)理解為細(xì)粒度的SOA,其具有服務(wù)組件化、按業(yè)務(wù)組織團(tuán)隊(duì)、輕量級(jí)通信、去中心化治理以及去中心化數(shù)據(jù)治理等特性[4]。相比傳統(tǒng)分布式服務(wù)來(lái)說(shuō),微服務(wù)的粒度更小,服務(wù)之間耦合度更低,服務(wù)的敏捷性更高,是分布式服務(wù)的發(fā)展趨勢(shì)。

1 分布式系統(tǒng)認(rèn)證方案

傳統(tǒng)的Web應(yīng)用通常采用Cookie-Session模式進(jìn)行用戶(hù)身份認(rèn)證,在服務(wù)端生成用戶(hù)信息數(shù)據(jù)保存在Session中,并將在服務(wù)端產(chǎn)生的Cookie信息以響應(yīng)報(bào)文的方式返回給客戶(hù)端。用戶(hù)再次發(fā)送請(qǐng)求時(shí)附帶服務(wù)器返回的Cookie,服務(wù)器根據(jù)存儲(chǔ)的Session信息和附帶的Cookie對(duì)用戶(hù)的身份進(jìn)行認(rèn)證[5]。分布式應(yīng)用系統(tǒng)中每個(gè)服務(wù)都會(huì)有認(rèn)證和授權(quán)的需求,采用傳統(tǒng)的用戶(hù)身份認(rèn)證將面臨Session信息共享的問(wèn)題。

在基于微服務(wù)架構(gòu)的分布式應(yīng)用系統(tǒng)中,用戶(hù)的請(qǐng)求可能會(huì)由不同的服務(wù)器來(lái)處理,這就面臨著單個(gè)應(yīng)用服務(wù)器中的Session信息如何共享的問(wèn)題。Session共享的解決方案通常有:所有服務(wù)器通過(guò)同步進(jìn)行Session復(fù)制;用戶(hù)的每次請(qǐng)求強(qiáng)制分發(fā)到特定的服務(wù)器進(jìn)行Session綁定;在單獨(dú)的服務(wù)器上使用Redis緩存技術(shù)實(shí)現(xiàn)Session集中管理;基于Cookie管理進(jìn)行Session共享等?;赟ession的認(rèn)證方案在服務(wù)端對(duì)會(huì)話進(jìn)行控制,具有較高的安全性。但Session方案需要基于Cookie進(jìn)行認(rèn)證,在移動(dòng)客戶(hù)端上不能被有效使用;而分布式應(yīng)用系統(tǒng)中,Session的復(fù)制、綁定以及集中管理等共享解決方案都會(huì)增加系統(tǒng)的網(wǎng)絡(luò)開(kāi)銷(xiāo)[6],見(jiàn)圖1。

圖1 分布式系統(tǒng)基于Session的認(rèn)證方式

為了克服分布式系統(tǒng)中基于Session認(rèn)證的不足,可以采用基于Token的分布式系統(tǒng)認(rèn)證方案,見(jiàn)圖2。用戶(hù)通過(guò)用戶(hù)名和密碼向身份認(rèn)證服務(wù)器發(fā)送登錄認(rèn)證請(qǐng)求,服務(wù)端認(rèn)證成功后會(huì)生成一個(gè)帶簽名的Token發(fā)給客戶(hù)端,客戶(hù)端可以放到Cookie或LocalStorage等存儲(chǔ)對(duì)象中;發(fā)送資源授權(quán)服務(wù)請(qǐng)求時(shí),在請(qǐng)求頭中攜帶Token信息,身份認(rèn)證服務(wù)對(duì)Token信息進(jìn)行解析校驗(yàn),通過(guò)用戶(hù)身份認(rèn)證后返回用戶(hù)角色的權(quán)限信息,若用戶(hù)具有訪問(wèn)該資源的權(quán)限,則資源授權(quán)服務(wù)將請(qǐng)求的資源數(shù)據(jù)返回給用戶(hù),否則返回用戶(hù)權(quán)限不足的信息。

圖2 基于Token認(rèn)證的授權(quán)過(guò)程

和傳統(tǒng)的認(rèn)證方式相比較,基于Token認(rèn)證的優(yōu)點(diǎn)是,支持跨域訪問(wèn),無(wú)狀態(tài)服務(wù)端可擴(kuò)展,能夠防止跨站域請(qǐng)求偽造(CSRF),優(yōu)化網(wǎng)絡(luò)開(kāi)銷(xiāo)和系統(tǒng)性能等。但基于Token認(rèn)證也有自身的不足,Token由于自包含信息,數(shù)據(jù)量較大,而且每次請(qǐng)求都要傳遞Token,比較占用帶寬。另外,服務(wù)端簽發(fā)Token時(shí)包含了簽發(fā)時(shí)間和失效時(shí)間,因此存在超過(guò)有效時(shí)間需要重新登錄客戶(hù)端的問(wèn)題[7]。基于Token的認(rèn)證方式下,服務(wù)端不用存儲(chǔ)用戶(hù)信息,不需要考慮用戶(hù)在哪臺(tái)服務(wù)器登錄過(guò),解決了在服務(wù)端存儲(chǔ)用戶(hù)信息的諸多問(wèn)題。因此,Token認(rèn)證方式更適合前后端分離的分布式應(yīng)用系統(tǒng)。

2 JWT認(rèn)證機(jī)制

JWT(Json Web Token)是一種基于JSON的開(kāi)發(fā)標(biāo)準(zhǔn)(RFC 7519),由三部分組成,分別是頭部信息(Header)、載荷信息(Payload)和簽名信息(Signature),每部分中間使用點(diǎn)(.)分隔[8]。其中頭部包括Token的類(lèi)型及使用的哈希算法;載荷部分可以存放簽發(fā)者、過(guò)期時(shí)間戳以及面向的用戶(hù)等內(nèi)置字段,也可自定義字段;簽名部分用于防止JWT內(nèi)容被篡改,使用Base64Url將前面兩部分進(jìn)行編碼,編碼后使用點(diǎn)(.)連接組成字符串,最后使用Header中聲明的簽名算法進(jìn)行簽名。特別適用于分布式應(yīng)用的單點(diǎn)登陸(SSO)場(chǎng)景。在目前的Token認(rèn)證中,越來(lái)越多地使用了JWT認(rèn)證。它基于JSON格式數(shù)據(jù)并采用加密算法進(jìn)行簽名,傳遞的信息通過(guò)數(shù)字簽名可以被驗(yàn)證和信任。JWT可以使用HMAC算法或者RSA的公鑰/私鑰核對(duì)簽名,防止信息被篡改。

基于JWT的登錄認(rèn)證過(guò)程如下:(1)首次登錄,客戶(hù)端輸入用戶(hù)名和密碼,Post提交后交由服務(wù)器的LoginAction處理;(2)LoginAction調(diào)用認(rèn)證服務(wù)進(jìn)行認(rèn)證,若認(rèn)證通過(guò),LoginAction調(diào)用用戶(hù)信息服務(wù)得到用戶(hù)完整信息;(3)LoginAction得到用戶(hù)完整信息后,從配置文件獲取簽名秘鑰,開(kāi)始Token的生成;(4)Token生成過(guò)程中可以調(diào)用第三方的JWT生成庫(kù)生成JWT簽名數(shù)據(jù);(5)LoginAction將JWT簽名數(shù)據(jù)設(shè)置到Cookie中,或者設(shè)置到Http請(qǐng)求的HeaderAuthorization字段中,并重定向到首頁(yè),完成登錄認(rèn)證。

基于Token的認(rèn)證機(jī)制會(huì)在每一次請(qǐng)求中都帶上完成簽名的Token信息,基于JWT的請(qǐng)求認(rèn)證過(guò)程如下:(1)客戶(hù)端通過(guò)Post或Get請(qǐng)求系統(tǒng)資源訪問(wèn);(2)認(rèn)證服務(wù)攔截請(qǐng)求,并在Cookie中或者AuthorizationHead查找Token信息;(3)如果找到Token信息,則根據(jù)配置文件中的簽名秘鑰,調(diào)用JWT庫(kù)對(duì)Token信息進(jìn)行解密;(4)完成解碼并驗(yàn)證簽名通過(guò)后,對(duì)Token中的過(guò)期時(shí)間(exp)、該時(shí)間之前不處理(nbf)、用戶(hù)(aud)等信息進(jìn)行驗(yàn)證;(5)驗(yàn)證通過(guò)后,獲取用戶(hù)角色權(quán)限信息,對(duì)請(qǐng)求資源的訪問(wèn)權(quán)限進(jìn)行判斷;(6)若具有訪問(wèn)該資源的權(quán)限,則資源授權(quán)服務(wù)將資源數(shù)據(jù)返回給用戶(hù),否則返回用戶(hù)權(quán)限不足的信息。

3 Spring Security安全框架

Spring Security是Spring生態(tài)系統(tǒng)中的一員,是一個(gè)能夠?yàn)榛赟pring的企業(yè)應(yīng)用系統(tǒng)提供聲明式的安全訪問(wèn)控制解決方案的安全框架。OAuth 2.0協(xié)議規(guī)定第三方獲取資源必須按照獲取認(rèn)證、獲取訪問(wèn)資源令牌以及通過(guò)令牌獲取指定資源的順序進(jìn)行,Spring Security組件集成了對(duì)該協(xié)議的支持[9]。Spring Security用以解決企業(yè)應(yīng)用的安全訪問(wèn)控制,其實(shí)現(xiàn)機(jī)制是通過(guò)過(guò)濾器鏈對(duì)系統(tǒng)的請(qǐng)求進(jìn)行攔截,校驗(yàn)請(qǐng)求是否可以訪問(wèn)對(duì)應(yīng)的系統(tǒng)資源[10],其過(guò)濾器鏈如圖3所示。

圖3 Spring Security過(guò)濾器鏈

SecurityContextPersistenceFilter是整個(gè)攔截過(guò)程的入口和出口;UsernamePasswordAuthenticationFilter用于處理來(lái)自表單提交的認(rèn)證,表單必須提供對(duì)應(yīng)的用戶(hù)名和密碼;FilterSecurityInterceptor用于保護(hù)系統(tǒng)資源;ExceptionTranslationFilter負(fù)責(zé)捕獲來(lái)自過(guò)濾器鏈的所有異常,處理AuthenticationException和AccessDeniedException異常,并將其他異常繼續(xù)拋出。

在使用用戶(hù)名和密碼的認(rèn)證場(chǎng)景中,Spring Security安全框架認(rèn)證管理器(AuthenticationManager)認(rèn)證過(guò)程如下:(1)用戶(hù)提交的用戶(hù)名、密碼被過(guò)濾器鏈中的UsernamePasswordAuthenticationFilter過(guò)濾器獲取到,并將請(qǐng)求信息封裝為Authentication(通常情況下以Authentication接口的UsernamePasswordAuthenticationToken這個(gè)實(shí)現(xiàn)類(lèi)來(lái)處理)。(2)過(guò)濾器將Authentication提交至認(rèn)證管理器AuthenticationManager進(jìn)行認(rèn)證。(AuthenticationManager接口是認(rèn)證的核心接口,它的實(shí)現(xiàn)類(lèi)為ProviderManager。Spring Security支持多種認(rèn)證方式,ProviderManager維護(hù)著一個(gè)List列表,存放多種認(rèn)證方式,最終實(shí)際的認(rèn)證工作是由AuthenticationProvider完成。)(3)Web表單對(duì)應(yīng)的AuthenticationProvider實(shí)現(xiàn)類(lèi)為DaoAuthenticationProvider,AuthenticationManager將認(rèn)證委托給DaoAuthenticationProvider進(jìn)行認(rèn)證。(4)DaoAuthenticationProvider內(nèi)部維護(hù)著一個(gè)UserDetailsService負(fù)責(zé)UserDetails的獲取。認(rèn)證成功后,AuthenticationProvider將UserDetails填充至Authentication,并由AuthenticationManager身份管理器返回一個(gè)被填充滿(mǎn)了信息的Authentication實(shí)例(包含上面提到的權(quán)限信息、身份信息、細(xì)節(jié)信息,但密碼通常會(huì)被移除)。(5)SecurityContextHolder安全上下文容器將填充了信息的Authentication,通過(guò)SecurityContextHolder.getContext().setAuthentication()方法將其設(shè)置到安全上下文中。

授權(quán)是用戶(hù)認(rèn)證通過(guò)以后,訪問(wèn)系統(tǒng)資源,Spring Security根據(jù)用戶(hù)的權(quán)限進(jìn)行校驗(yàn)的過(guò)程。Spring Security安全框架授權(quán)管理器(AccessDecisionManager)授權(quán)過(guò)程如下:(1)攔截請(qǐng)求,已認(rèn)證用戶(hù)訪問(wèn)受保護(hù)的web資源將被SecurityFilterChain中的FilterSecurityInterceptor的子類(lèi)攔截。(2)獲取資源訪問(wèn)策略,F(xiàn)ilterSecurityInterceptor通過(guò)SecurityMetadataSource.getAttributes()獲取訪問(wèn)當(dāng)前資源所需要的權(quán)限,返回權(quán)限集合Collection。(3)FilterSecurityInterceptor調(diào)用AccessDecisionManager.Decide()進(jìn)行授權(quán)決策,AccessDecisionManager采用投票的方式來(lái)確定是否能夠訪問(wèn)受保護(hù)資源,若決策通過(guò),則允許訪問(wèn)資源,否則將禁止訪問(wèn)。

授權(quán)的方式包括Web授權(quán)和方法授權(quán),Web授權(quán)通過(guò)url攔截進(jìn)行授權(quán),方法授權(quán)通過(guò)方法攔截進(jìn)行授權(quán)。兩種方式都調(diào)用AccessDecisionManager.Decide()進(jìn)行授權(quán)決策,若為Web授權(quán)則攔截器為FilterSecurityInterceptor,若為方法授權(quán)則攔截器為MethodSecurityInterceptor[11]。如果同時(shí)通過(guò)Web授權(quán)和方法授權(quán)則先執(zhí)行Web授權(quán),再執(zhí)行方法授權(quán),最后決策通過(guò),則允許訪問(wèn)資源,否則將禁止訪問(wèn)。

4 分布式系統(tǒng)認(rèn)證技術(shù)方案

基于微服務(wù)架構(gòu)的分布式應(yīng)用系統(tǒng)中,可以將認(rèn)證授權(quán)服務(wù)交由一個(gè)單獨(dú)的微服務(wù)來(lái)實(shí)現(xiàn),以完成整個(gè)系統(tǒng)認(rèn)證授權(quán)的請(qǐng)求。根據(jù)上述分布式系統(tǒng)認(rèn)證方案的分析,采用基于Token的分布式系統(tǒng)認(rèn)證方式,使用JWT格式來(lái)存儲(chǔ)Token,分布式系統(tǒng)認(rèn)證技術(shù)方案如圖4所示。

圖4 分布式系統(tǒng)認(rèn)證技術(shù)方案

認(rèn)證微服務(wù)UAA組件提供用戶(hù)登錄和接入認(rèn)證、授權(quán)以及令牌生成的功能;API網(wǎng)關(guān)作為系統(tǒng)的入口,主要功能是統(tǒng)一接入、協(xié)議適配、流量管理以及安全防護(hù)等功能,還具有身份認(rèn)證、負(fù)載均衡、限流降級(jí)以及系統(tǒng)緩存等功能[12]。接入方通過(guò)統(tǒng)一的API網(wǎng)關(guān)接入微服務(wù),系統(tǒng)的非業(yè)務(wù)功能交由API網(wǎng)關(guān)處理,資源微服務(wù)則提供系統(tǒng)的業(yè)務(wù)功能。

5 基于JWT的認(rèn)證實(shí)現(xiàn)

研究案例實(shí)驗(yàn)采用基于Spring Security的安全框架和基于Spring Cloud的微服務(wù)平臺(tái)框架,并采用JWT格式存儲(chǔ)Token信息進(jìn)行認(rèn)證,使用Maven技術(shù)對(duì)項(xiàng)目進(jìn)行管理和構(gòu)建;系統(tǒng)由父工程distributed-security以及UAA、resource、gateway和discovery四個(gè)模塊組成,UAA模塊作為認(rèn)證微服務(wù),resource模塊作為資源微服務(wù),gateway模塊作為API網(wǎng)關(guān)微服務(wù),采用Spring Cloud Gateway網(wǎng)關(guān)組件,discovery模塊作為注冊(cè)中心微服務(wù),注冊(cè)中心采用Nacos來(lái)發(fā)現(xiàn)、配置和管理微服務(wù)。

登錄認(rèn)證和權(quán)限驗(yàn)證主要由兩個(gè)過(guò)濾器類(lèi)JWTLoginFilter和JWTAuthenticationFilter實(shí)現(xiàn)。JWTLoginFilter類(lèi)繼承自UsernamePasswordAuthenticationFilter,功能是驗(yàn)證用戶(hù)名密碼;驗(yàn)證通過(guò)后會(huì)生成一個(gè)Token,并將其返回給客戶(hù)端。其采用重寫(xiě)attemptAuthentication和successfulAuthentication的方法,使用attemptAuthentication接收并解析用戶(hù)憑證,用戶(hù)成功登錄后調(diào)用successfulAuthentication,在該方法中生成Token,核心代碼如圖5。

圖5 JWTLoginFilter類(lèi)過(guò)濾器核心代碼

JWTAuthenticationFilter類(lèi)繼承自BasicAuthenticationFilter,功能是實(shí)現(xiàn)Token的校驗(yàn)。在doFilterInternal方法中,首先從http頭的Authorization項(xiàng)讀取Token數(shù)據(jù),然后用Jwts包提供的方法校驗(yàn)token的合法性,若校驗(yàn)通過(guò),則請(qǐng)求合法,其核心代碼如圖6。

圖6 JWTAuthenticationFilter類(lèi)過(guò)濾器核心代碼

6 結(jié)語(yǔ)

在基于微服務(wù)架構(gòu)的分布式應(yīng)用系統(tǒng)中,傳統(tǒng)的基于Session模式的用戶(hù)身份認(rèn)證存在Session共享的問(wèn)題,多種解決方案都會(huì)增加系統(tǒng)的網(wǎng)絡(luò)開(kāi)銷(xiāo);而基于Token的分布式系統(tǒng)認(rèn)證方案可以很好地解決這些問(wèn)題。在分布式系統(tǒng)中,認(rèn)證授權(quán)功能可以由一個(gè)單獨(dú)的微服務(wù)實(shí)現(xiàn),系統(tǒng)中的認(rèn)證和授權(quán)的需求都可以交由這個(gè)單獨(dú)的微服務(wù)完成。在Token認(rèn)證方式中,采用JWT格式來(lái)存儲(chǔ)Token信息。采用Spring Cloud微服務(wù)框架和Spring Security安全框架,設(shè)計(jì)并實(shí)現(xiàn)了基于JWT的認(rèn)證授權(quán)原型系統(tǒng)。基于JWT的Token認(rèn)證授權(quán)機(jī)制攜帶的信息簽名能保證數(shù)據(jù)不被篡改,為分布式應(yīng)用系統(tǒng)提供安全可靠的認(rèn)證授權(quán)保障,在基于微服務(wù)架構(gòu)的分布式應(yīng)用系統(tǒng)應(yīng)用中具有良好的應(yīng)用場(chǎng)景。

猜你喜歡
服務(wù)端過(guò)濾器客戶(hù)端
云存儲(chǔ)中基于相似性的客戶(hù)-服務(wù)端雙端數(shù)據(jù)去重方法
縣級(jí)臺(tái)在突發(fā)事件報(bào)道中如何應(yīng)用手機(jī)客戶(hù)端
孵化垂直頻道:新聞客戶(hù)端新策略
支持過(guò)濾器的REST模型研究與實(shí)現(xiàn)
基于Vanconnect的智能家居瘦客戶(hù)端的設(shè)計(jì)與實(shí)現(xiàn)
聲音過(guò)濾器
新時(shí)期《移動(dòng)Web服務(wù)端開(kāi)發(fā)》課程教學(xué)改革的研究
在Windows Server 2008上創(chuàng)建應(yīng)用
基于LOGO!的空氣過(guò)濾器自潔控制系統(tǒng)
HVM膜過(guò)濾器管板改造總結(jié)
双流县| 吐鲁番市| 高淳县| 和龙市| 五常市| 甘谷县| 南澳县| 浮梁县| 广昌县| 凯里市| 大埔区| 尚志市| 枣阳市| 湾仔区| 武强县| 湘乡市| 祁东县| 嘉义县| 得荣县| 芒康县| 大同市| 墨玉县| 宣武区| 体育| 夏津县| 青州市| 承德市| 新竹市| 伊宁县| 丰城市| 临洮县| 吉林省| 巩留县| 穆棱市| 金平| 杭州市| 韶关市| 库尔勒市| 信丰县| 将乐县| 岳阳县|