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

?

Spring Security+JWT實(shí)現(xiàn)微服務(wù)架構(gòu)中的身份驗(yàn)證和授權(quán)

2024-09-13 00:00:00呂玉桂
電腦知識(shí)與技術(shù) 2024年22期

摘要:身份驗(yàn)證和授權(quán)是保障Web應(yīng)用程序安全性的關(guān)鍵因素。文章以基于微服務(wù)架構(gòu)的電商應(yīng)用為例,從設(shè)計(jì)思路到實(shí)現(xiàn)過程,介紹了基于Spring Security框架結(jié)合JWT實(shí)現(xiàn)分布式環(huán)境下的身份驗(yàn)證和授權(quán)技術(shù)。系統(tǒng)采用RBAC模型實(shí)現(xiàn)了基于角色的動(dòng)態(tài)授權(quán),借助Java的jjwt庫按照J(rèn)WT規(guī)則生成Token,解決了分布式環(huán)境下的Token過期和Token傳遞問題,保證了服務(wù)之間的正確調(diào)用和良好的用戶體驗(yàn)。

關(guān)鍵詞:Spring Security;JWT;RBAC;微服務(wù);身份驗(yàn)證;授權(quán)

中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A

文章編號(hào):1009-3044(2024)22-0060-04

開放科學(xué)(資源服務(wù))標(biāo)識(shí)碼(OSID)

0 引言

隨著互聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,其在各個(gè)行業(yè)的廣泛應(yīng)用日益廣泛。隨著用戶數(shù)量的激增和業(yè)務(wù)場景的日益復(fù)雜化,傳統(tǒng)的單體架構(gòu)已難以滿足當(dāng)前互聯(lián)網(wǎng)技術(shù)的發(fā)展需求。為了提升系統(tǒng)的可維護(hù)性和擴(kuò)展性,并降低維護(hù)成本,微服務(wù)架構(gòu)應(yīng)運(yùn)而生。該架構(gòu)將一個(gè)大型軟件應(yīng)用分解為一組小型服務(wù),每個(gè)服務(wù)均運(yùn)行在其獨(dú)立的進(jìn)程中,使用輕量級(jí)機(jī)制通信,并獨(dú)立部署每個(gè)服務(wù),提升系統(tǒng)的維護(hù)性和擴(kuò)展性。

微服務(wù)架構(gòu)同樣面臨挑戰(zhàn),服務(wù)之間依賴API進(jìn)行通信,因此確保API安全、限制未授權(quán)用戶的訪問以及數(shù)據(jù)篡改等至關(guān)重要。Spring Security作為安全框架提供了身份驗(yàn)證、授權(quán)、加密、會(huì)話管理等功能。JWT用于在多個(gè)服務(wù)之間傳輸加密的用戶信息,進(jìn)行身份驗(yàn)證和標(biāo)識(shí)。RBAC基于角色實(shí)現(xiàn)對資源的訪問控制。三者融合在一起實(shí)現(xiàn)微服務(wù)架構(gòu)的安全策略。

本文以電商系統(tǒng)為例,介紹在微服務(wù)架構(gòu)中使用Spring Security+JWT結(jié)合RBAC實(shí)現(xiàn)身份驗(yàn)證和授權(quán)。

1 核心技術(shù)

1.1 Spring Security

Spring Security是一個(gè)功能強(qiáng)大且高度可定制的基于Java的認(rèn)證和授權(quán)框架,旨在為應(yīng)用程序提供全面的安全保護(hù)。它提供了一系列的API和功能,幫助開發(fā)人員在應(yīng)用程序中實(shí)現(xiàn)各種安全特性,如用戶認(rèn)證、授權(quán)、密碼加密等。通過提供保護(hù)機(jī)制來防止常見的安全漏洞,CSRF,XSS、點(diǎn)擊劫持等[1],從而提高應(yīng)用程序的安全性。核心原理是通過 Spring AOP和 Servlet 過濾器來保護(hù)應(yīng)用程序。當(dāng) HTTP 請求到達(dá)應(yīng)用程序時(shí),通過一組過濾器鏈進(jìn)行不同的安全檢查,驗(yàn)證用戶身份以及是否有權(quán)限訪問所請求的資源[2]。支持基于角色的訪問控制,允許開發(fā)者定制安全策略。Spring Security強(qiáng)大的功能和靈活性使其成為保護(hù)Spring應(yīng)用程序的首選安全解決方案。

1.2 JWT

JWT(JSON Web Token) 是一種基于JSON格式的輕量級(jí)安全令牌標(biāo)準(zhǔn),用于在網(wǎng)絡(luò)應(yīng)用中傳遞身份信息[3],它由頭部、載荷和簽名三部分組成。用戶登錄后,服務(wù)器會(huì)生成 JWT 并發(fā)送給客戶端??蛻舳藢⒘钆拼鎯?chǔ)在本地LocalStorage,后續(xù)攜帶JWT向服務(wù)器發(fā)送請求,服務(wù)器通過驗(yàn)證JWT確認(rèn)用戶身份[4]。JWT具有一定的有效期,過期后須重新獲取新的令牌。JWT的跨域性、安全性、擴(kuò)展性適合在分布式架構(gòu)中實(shí)現(xiàn)身份驗(yàn)證。

1.3 RBAC

RBAC(Role-Based Access Control) 基于角色的訪問控制,是一種廣泛應(yīng)用于系統(tǒng)和網(wǎng)絡(luò)安全中的訪問控制模型[5]。RBAC模型引入了角色這一中間層概念,通過角色與權(quán)限的關(guān)聯(lián)來簡化用戶與權(quán)限的直接關(guān)系,從而更靈活高效地管理系統(tǒng)的訪問控制。通過將權(quán)限授予角色,可以減少權(quán)限分配的復(fù)雜性和重復(fù)性。當(dāng)用戶角色發(fā)生變化時(shí),只需要更改角色與權(quán)限的關(guān)聯(lián),而無須管理每個(gè)用戶的權(quán)限。RBAC模型以其靈活性、簡化性、細(xì)粒度控制等優(yōu)點(diǎn)成為權(quán)限控制的主要模型。

2 系統(tǒng)架構(gòu)

本文介紹的電商應(yīng)用主要面向前臺(tái)用戶和后臺(tái)的管理員,按照功能模塊劃分為前臺(tái)模塊和后臺(tái)模塊。具體功能模塊如圖1所示。

電商應(yīng)用涉及功能多,需求變化快,業(yè)務(wù)復(fù)雜。傳統(tǒng)的單體架構(gòu)難以擴(kuò)展,采用微服務(wù)架構(gòu)根據(jù)功能拆分為獨(dú)立的服務(wù),單個(gè)部署,獨(dú)立擴(kuò)展,可以提高系統(tǒng)的穩(wěn)定性和擴(kuò)展性。微服務(wù)架構(gòu)同樣面臨挑戰(zhàn),要解決服務(wù)間的通信、數(shù)據(jù)一致性、分布式事務(wù)處理等問題。本系統(tǒng)采取國內(nèi)主流的微服務(wù)解決方案Spring Cloud+Spring Cloud Alibaba技術(shù)棧[3],從服務(wù)發(fā)現(xiàn)、配置、熔斷、遠(yuǎn)程調(diào)用以及分布式事務(wù)全方位實(shí)現(xiàn)微服務(wù)應(yīng)用。核心組件的應(yīng)用有:Nacos:提供注冊中心和配置中心,便于服務(wù)的發(fā)現(xiàn)和統(tǒng)一的配置管理。Sentinel: 解決服務(wù)熔斷降級(jí),流量控制,提升系統(tǒng)的可用性和穩(wěn)定性。Feign: 簡潔快速地實(shí)現(xiàn)微服務(wù)之間的通信和負(fù)載均衡。Seata: 以簡單高效的方式解決分布式事務(wù),讓開發(fā)人員專注于業(yè)務(wù)邏輯。Gateway: 提供微服務(wù)統(tǒng)一的訪問入口,實(shí)現(xiàn)權(quán)限攔截。服務(wù)列表:每個(gè)獨(dú)立的功能模塊,劃分為一個(gè)獨(dú)立服務(wù)。身份驗(yàn)證授權(quán)服務(wù):驗(yàn)證用戶身份并進(jìn)行授權(quán)的服務(wù)。

系統(tǒng)架構(gòu)如圖2所示。

本系統(tǒng)面向的PC端用戶和移動(dòng)端用戶擁有不同的權(quán)限,每當(dāng)請求后端服務(wù)時(shí),都需要身份信息。身份驗(yàn)證是用戶訪問后端服務(wù)的必經(jīng)之路,為提升性能,會(huì)獨(dú)立設(shè)計(jì)身份驗(yàn)證授權(quán)服務(wù)實(shí)現(xiàn)用戶身份及權(quán)限的過濾。

3 身份驗(yàn)證以及授權(quán)實(shí)現(xiàn)

3.1 數(shù)據(jù)庫設(shè)計(jì)

本系統(tǒng)面向管理員用戶和終端小程序用戶,兩者需要存儲(chǔ)不同的用戶信息以及權(quán)限,因此獨(dú)立設(shè)計(jì)會(huì)員表和系統(tǒng)用戶表,根據(jù)RBAC設(shè)計(jì)基于用戶和角色權(quán)限都是多對多關(guān)系。設(shè)計(jì)用戶相關(guān)表如圖3所示。

3.2 網(wǎng)關(guān)設(shè)計(jì)

網(wǎng)關(guān)作為用戶訪問后端服務(wù)的第一道關(guān)卡,主要用于實(shí)現(xiàn)用戶攔截。用戶在服務(wù)器登錄成功時(shí),根據(jù)JWT生成Token返回到客戶端,并保存在LocalStorage[4]。用戶向后端發(fā)請求時(shí)須攜帶Token,網(wǎng)關(guān)則驗(yàn)證用戶是否在請求頭中包含了Token,如果有,則放行,否則攔截。

在網(wǎng)關(guān)服務(wù)中,創(chuàng)建TokenCheckFilter實(shí)現(xiàn)GlobalFilter接口,提供token的驗(yàn)證。用戶在訪問時(shí),通過請求頭header攜帶Authorization : Bearer Token。如果Token合法并且在Redis中存在,則繼續(xù)進(jìn)行。否則直接攔截在網(wǎng)關(guān)之外。代碼思路如下:

public class TokenCheckFilter implements GlobalFilter, Ordered {

public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { //1.判斷是否是可以放行的url

//2.從header中獲取身份授權(quán)

//3.獲取token的實(shí)際內(nèi)容--將前綴Bearer替換為""

//4.如果token合法,并且在redis中存在(沒有過期)則放行

//5.如果沒有合法的token,則攔截在網(wǎng)關(guān)之外

//6.輸出結(jié)果 }

3.3 身份驗(yàn)證授權(quán)服務(wù)

授權(quán)服務(wù)用于用戶身份信息及授權(quán)驗(yàn)證。如果用戶第一次登錄,則需要提供用戶名密碼或者小程序用戶信息進(jìn)行數(shù)據(jù)庫驗(yàn)證。如果提供的信息正確,則根據(jù)JWT生成Token,存到redis,并將token信息返回前端,存入LocalStorage。其中,Spring Security框架負(fù)責(zé)登錄驗(yàn)證,用戶注銷,加密處理以及相關(guān)安全的配置。

3.3.1 登錄驗(yàn)證

采用Spring Security的驗(yàn)證功能,自定義實(shí)現(xiàn)接口UserDetailsService接口,提供登錄驗(yàn)證。本項(xiàng)目有兩種類型用戶,使用同一套登錄驗(yàn)證程序。因此在登錄時(shí)使用userType=sysUser或者userType=Member分別進(jìn)行身份驗(yàn)證和授權(quán)處理,即同一套驗(yàn)證登錄程序處理兩種類型的用戶登錄[5]。代碼思路如下:

public class UserDetailServiceImpl implements UserDetailsService {

//小程序傳遞header信息loginType=Member,后臺(tái)用戶loginType=SysUser

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

//獲取用戶類型

switch (loginType) {

case AuthConstant.SYS_USER: //后臺(tái)系統(tǒng)用戶

{//根據(jù)用戶名查詢表sys_user,sys_role,sys_menu,sys_user_role,sys_role_menu

//獲取用戶以及權(quán)限并返回系統(tǒng)用戶對象

}

case AuthConstant.MEMBER:

{ //調(diào)用小程序接口獲取open_id,查詢數(shù)據(jù)庫如果有直接返回

//如果不存在則自動(dòng)注冊插入數(shù)據(jù)庫,返回會(huì)員對象 }

}

return //系統(tǒng)用戶或者會(huì)員; } }

3.3.2 安全驗(yàn)證

繼承使用Spring Security的WebSecurityConfigurer?Adapter類實(shí)現(xiàn)安全驗(yàn)證功能,處理登錄,注銷以及加密等邏輯。

public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Bean //登錄成功的處理邏輯

public AuthenticationSuccessHandler authenticationSuccessHandler()

{ // 生成token,返回前端,同時(shí)保存在redis }

@Bean //處理登錄失敗的邏輯

public AuthenticationFailureHandler authenticationFailureHandler()

{ //設(shè)置錯(cuò)誤信息,并將結(jié)果寫入json對象,輸出到客戶端 }

@Bean //注銷成功處理邏輯

public LogoutSuccessHandler logoutSuccessHandler()

{ //從header中獲取token,獲取真正的token,刪除redis緩存 }

}

3.4 Token的解析和續(xù)約

用戶訪問后端服務(wù)時(shí)攜帶的Token僅包含用戶信息,用戶的權(quán)限信息存儲(chǔ)在服務(wù)端Redis中。Spring Security進(jìn)行身份驗(yàn)證時(shí)需要用戶對象以及權(quán)限集合,需要將Redis中的用戶級(jí)權(quán)限字符串反序列化為用戶對象,轉(zhuǎn)換成Security的身份對象,存入Security上下文,保證后續(xù)的操作可用,這個(gè)過程就是Token解析。同時(shí),為了提升用戶體驗(yàn),在用戶持續(xù)訪問網(wǎng)站的過程中,Token過期時(shí)間自動(dòng)后延,避免絕對過期,即Token的續(xù)約。使用過濾器技術(shù),實(shí)現(xiàn)接口OncePerRequestFilter,在每次請求時(shí)進(jìn)行Token解析和續(xù)約操作。代碼思路如下:

public class TokenTranslateFilter extends OncePerRequestFilter {

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

//1.獲取路徑,判斷是否需要放行

//2.解析token

//3.續(xù)約操作,設(shè)置redisTemplate.expire(token,過期時(shí)間);

//4.將token轉(zhuǎn)換成用戶對象放入security,獲取登錄類型,轉(zhuǎn)換為會(huì)員或者管理員

//5.將token字符串解析為身份令牌對象,登錄成功時(shí)存入authentication對象

//6.將認(rèn)證對象保存到security上下文

}}

3.5 遠(yuǎn)程服務(wù)Token傳遞

微服務(wù)架構(gòu)中經(jīng)常涉及服務(wù)之間的調(diào)用,在本案例中如訂單服務(wù)會(huì)調(diào)用商品服務(wù)。用戶在調(diào)用訂單服務(wù)時(shí)提供了合法的token,但是訂單服務(wù)使用OpenFeign調(diào)用商品服務(wù)時(shí),用戶在發(fā)送完請求后,Header中的Token已經(jīng)丟失,因此訂單服務(wù)內(nèi)部調(diào)用商品服務(wù)時(shí)會(huì)導(dǎo)致遠(yuǎn)程調(diào)用失敗。為了保證在遠(yuǎn)程調(diào)用時(shí)將原始服務(wù)攜帶的Token傳遞到目標(biāo)服務(wù),通過實(shí)現(xiàn)OpenFeign組件提供的RequestInterceptor攔截器接口修改請求頭,將請求頭header中的用戶Token信息傳遞到目標(biāo)服務(wù)中。代碼思路如下:

public class FeignInterceptor implements RequestInterceptor {

public void apply(RequestTemplate template) {

//1.獲取請求對象

//2.從請求頭中獲取Token和用戶類型

//3.修改請求模版,將Token和用戶類型傳遞到后續(xù)服務(wù)

//4.template.header(AuthConstant.AUTHORIZATION, token)

}

}

}

}

以上關(guān)于身份驗(yàn)證設(shè)計(jì)思路使用Spring Security解決了用戶登錄驗(yàn)證、加密、權(quán)限攔截的問題。JWT將用戶信息加密生成Token標(biāo)識(shí)用戶身份,實(shí)現(xiàn)了微服務(wù)之間的用戶身份傳遞,使用RBAC模型,動(dòng)態(tài)授權(quán),實(shí)現(xiàn)了基于角色的用戶權(quán)限,三者結(jié)合解決了微服務(wù)架構(gòu)的用戶安全。

4 結(jié)束語

本文中電商項(xiàng)目自定義授權(quán)服務(wù),采用Spring Security提供的身份驗(yàn)證和授權(quán)等解決方案保護(hù)了Web應(yīng)用程序的安全性。結(jié)合JWT將用戶信息通過簽名生成Token令牌保存在客戶端,同時(shí)將用戶及權(quán)限信息序列化之后存入Redis,并處理了Token的校驗(yàn)解析以及續(xù)約,保證了微服務(wù)之間的正確調(diào)用。在測試中,本項(xiàng)目身份驗(yàn)證安全可靠且體驗(yàn)良好。項(xiàng)目涉及的業(yè)務(wù)邏輯有一定規(guī)模和復(fù)雜度,使用微服務(wù)架構(gòu)解決了擴(kuò)展性但同時(shí)項(xiàng)目架構(gòu)及身份安全控制也變得更加復(fù)雜。未來,將會(huì)繼續(xù)探索和研究關(guān)于分布式環(huán)境中應(yīng)用程序安全的實(shí)現(xiàn)技術(shù),同時(shí)持續(xù)優(yōu)化關(guān)于微服務(wù)架構(gòu)的安全實(shí)現(xiàn),提升執(zhí)行效率,封裝為可重用的安全組件,快速地實(shí)現(xiàn)分布式架構(gòu)的安全保證。

參考文獻(xiàn):

[1] 李立猛.Spring Security解決登錄安全問題的方案[J].電子元器件與信息技術(shù),2023,7(1):110-113.

[2] 周虎.一種基于JWT認(rèn)證token刷新機(jī)制研究[J].軟件工程,2019,22(12):18-20.

[3] 王悅,張雷,錢英軍.基于SpringBoot微服務(wù)的Spring Security身份認(rèn)證機(jī)制研究[J].電腦編程技巧與維護(hù),2019(8):64-65,68.

[4] 肖雙林,何迎生,田杰,等.基于JWT+Spring Security的動(dòng)態(tài)權(quán)限管理系統(tǒng)[J].信息與電腦,2021(14):131-134.

[5] 王松.深入淺出Spring Security[M].北京:清華大學(xué)出版社,2021.

【通聯(lián)編輯:代影】

兰州市| 阿尔山市| 龙南县| 哈尔滨市| 东辽县| 宜春市| 遵义县| 米泉市| 万全县| 庐江县| 临湘市| 鲁山县| 武平县| 公主岭市| 曲阜市| 广宁县| 潼南县| 凌云县| 烟台市| 遵化市| 察隅县| 德庆县| 洪洞县| 亚东县| 通许县| 顺义区| 肥城市| 大厂| 无为县| 晴隆县| 卓资县| 敖汉旗| 无锡市| 开封市| 当阳市| 大邑县| 日土县| 普兰县| 宣恩县| 通州区| 荆门市|