999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Spring Security+JWT實現微服務架構中的身份驗證和授權

2024-09-13 00:00:00呂玉桂
電腦知識與技術 2024年22期

摘要:身份驗證和授權是保障Web應用程序安全性的關鍵因素。文章以基于微服務架構的電商應用為例,從設計思路到實現過程,介紹了基于Spring Security框架結合JWT實現分布式環境下的身份驗證和授權技術。系統采用RBAC模型實現了基于角色的動態授權,借助Java的jjwt庫按照JWT規則生成Token,解決了分布式環境下的Token過期和Token傳遞問題,保證了服務之間的正確調用和良好的用戶體驗。

關鍵詞:Spring Security;JWT;RBAC;微服務;身份驗證;授權

中圖分類號:TP311 文獻標識碼:A

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

開放科學(資源服務)標識碼(OSID)

0 引言

隨著互聯網技術的飛速發展,其在各個行業的廣泛應用日益廣泛。隨著用戶數量的激增和業務場景的日益復雜化,傳統的單體架構已難以滿足當前互聯網技術的發展需求。為了提升系統的可維護性和擴展性,并降低維護成本,微服務架構應運而生。該架構將一個大型軟件應用分解為一組小型服務,每個服務均運行在其獨立的進程中,使用輕量級機制通信,并獨立部署每個服務,提升系統的維護性和擴展性。

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

本文以電商系統為例,介紹在微服務架構中使用Spring Security+JWT結合RBAC實現身份驗證和授權。

1 核心技術

1.1 Spring Security

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

1.2 JWT

JWT(JSON Web Token) 是一種基于JSON格式的輕量級安全令牌標準,用于在網絡應用中傳遞身份信息[3],它由頭部、載荷和簽名三部分組成。用戶登錄后,服務器會生成 JWT 并發送給客戶端。客戶端將令牌存儲在本地LocalStorage,后續攜帶JWT向服務器發送請求,服務器通過驗證JWT確認用戶身份[4]。JWT具有一定的有效期,過期后須重新獲取新的令牌。JWT的跨域性、安全性、擴展性適合在分布式架構中實現身份驗證。

1.3 RBAC

RBAC(Role-Based Access Control) 基于角色的訪問控制,是一種廣泛應用于系統和網絡安全中的訪問控制模型[5]。RBAC模型引入了角色這一中間層概念,通過角色與權限的關聯來簡化用戶與權限的直接關系,從而更靈活高效地管理系統的訪問控制。通過將權限授予角色,可以減少權限分配的復雜性和重復性。當用戶角色發生變化時,只需要更改角色與權限的關聯,而無須管理每個用戶的權限。RBAC模型以其靈活性、簡化性、細粒度控制等優點成為權限控制的主要模型。

2 系統架構

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

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

系統架構如圖2所示。

本系統面向的PC端用戶和移動端用戶擁有不同的權限,每當請求后端服務時,都需要身份信息。身份驗證是用戶訪問后端服務的必經之路,為提升性能,會獨立設計身份驗證授權服務實現用戶身份及權限的過濾。

3 身份驗證以及授權實現

3.1 數據庫設計

本系統面向管理員用戶和終端小程序用戶,兩者需要存儲不同的用戶信息以及權限,因此獨立設計會員表和系統用戶表,根據RBAC設計基于用戶和角色權限都是多對多關系。設計用戶相關表如圖3所示。

3.2 網關設計

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

在網關服務中,創建TokenCheckFilter實現GlobalFilter接口,提供token的驗證。用戶在訪問時,通過請求頭header攜帶Authorization : Bearer Token。如果Token合法并且在Redis中存在,則繼續進行。否則直接攔截在網關之外。代碼思路如下:

public class TokenCheckFilter implements GlobalFilter, Ordered {

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

//2.從header中獲取身份授權

//3.獲取token的實際內容--將前綴Bearer替換為""

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

//5.如果沒有合法的token,則攔截在網關之外

//6.輸出結果 }

3.3 身份驗證授權服務

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

3.3.1 登錄驗證

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

public class UserDetailServiceImpl implements UserDetailsService {

//小程序傳遞header信息loginType=Member,后臺用戶loginType=SysUser

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

//獲取用戶類型

switch (loginType) {

case AuthConstant.SYS_USER: //后臺系統用戶

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

//獲取用戶以及權限并返回系統用戶對象

}

case AuthConstant.MEMBER:

{ //調用小程序接口獲取open_id,查詢數據庫如果有直接返回

//如果不存在則自動注冊插入數據庫,返回會員對象 }

}

return //系統用戶或者會員; } }

3.3.2 安全驗證

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

public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

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

public AuthenticationSuccessHandler authenticationSuccessHandler()

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

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

public AuthenticationFailureHandler authenticationFailureHandler()

{ //設置錯誤信息,并將結果寫入json對象,輸出到客戶端 }

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

public LogoutSuccessHandler logoutSuccessHandler()

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

}

3.4 Token的解析和續約

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

public class TokenTranslateFilter extends OncePerRequestFilter {

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

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

//2.解析token

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

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

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

//6.將認證對象保存到security上下文

}}

3.5 遠程服務Token傳遞

微服務架構中經常涉及服務之間的調用,在本案例中如訂單服務會調用商品服務。用戶在調用訂單服務時提供了合法的token,但是訂單服務使用OpenFeign調用商品服務時,用戶在發送完請求后,Header中的Token已經丟失,因此訂單服務內部調用商品服務時會導致遠程調用失敗。為了保證在遠程調用時將原始服務攜帶的Token傳遞到目標服務,通過實現OpenFeign組件提供的RequestInterceptor攔截器接口修改請求頭,將請求頭header中的用戶Token信息傳遞到目標服務中。代碼思路如下:

public class FeignInterceptor implements RequestInterceptor {

public void apply(RequestTemplate template) {

//1.獲取請求對象

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

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

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

}

}

}

}

以上關于身份驗證設計思路使用Spring Security解決了用戶登錄驗證、加密、權限攔截的問題。JWT將用戶信息加密生成Token標識用戶身份,實現了微服務之間的用戶身份傳遞,使用RBAC模型,動態授權,實現了基于角色的用戶權限,三者結合解決了微服務架構的用戶安全。

4 結束語

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

參考文獻:

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

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

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

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

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

【通聯編輯:代影】

主站蜘蛛池模板: 免费va国产在线观看| 蜜臀AV在线播放| 日韩在线永久免费播放| 亚洲中文字幕手机在线第一页| 国产人成在线视频| 欧洲熟妇精品视频| 91精品日韩人妻无码久久| 99re免费视频| 亚洲一级毛片| 无码专区第一页| 久久综合九色综合97网| 国产精品美女自慰喷水| 天天色天天操综合网| 人与鲁专区| 国产精品嫩草影院视频| 美女内射视频WWW网站午夜 | 国产午夜不卡| 亚洲第一色视频| 欧美a级在线| 高h视频在线| AV网站中文| 波多野结衣一区二区三区四区| 亚洲精品男人天堂| 蝌蚪国产精品视频第一页| 中文字幕无码中文字幕有码在线 | 在线网站18禁| 制服丝袜国产精品| 五月婷婷综合在线视频| 色综合久久无码网| 日韩久草视频| 91精品日韩人妻无码久久| 一级全免费视频播放| 色婷婷成人| 日韩精品一区二区三区大桥未久| 天堂亚洲网| 亚洲无码一区在线观看| 日韩专区欧美| 日韩欧美91| 国产一级α片| 久久这里只有精品23| 素人激情视频福利| 色婷婷色丁香| 大陆精大陆国产国语精品1024| 国产精品自拍露脸视频| 国产欧美日韩专区发布| 亚洲黄色视频在线观看一区| 久久久久久国产精品mv| 日本在线欧美在线| 国产资源免费观看| 国产成人夜色91| 99国产精品免费观看视频| 午夜人性色福利无码视频在线观看| 97人人做人人爽香蕉精品| 国产精品亚洲一区二区三区z| 91色老久久精品偷偷蜜臀| 高清国产va日韩亚洲免费午夜电影| 91免费观看视频| 一区二区自拍| 欧美综合成人| 首页亚洲国产丝袜长腿综合| 国产chinese男男gay视频网| 成人午夜免费观看| 欧美成人精品高清在线下载| 怡红院美国分院一区二区| 日本伊人色综合网| 亚洲va在线∨a天堂va欧美va| 国产视频a| 九九这里只有精品视频| 婷婷久久综合九色综合88| 亚洲美女久久| 国产精品福利社| 亚洲国产欧美目韩成人综合| 伊人AV天堂| 欧美综合激情| 国产毛片高清一级国语 | 91视频精品| 亚洲欧美日韩动漫| 欧美日韩高清| 色综合久久无码网| 日韩成人高清无码| 中文字幕欧美日韩高清| 国产欧美日韩精品第二区|