關(guān)鍵詞:權(quán)限管理;統(tǒng)一認證;RBAC;OAuth 2;信息系統(tǒng)
0 引言
隨著信息技術(shù)的不斷發(fā)展,機構(gòu)內(nèi)部應用系統(tǒng)的數(shù)量和復雜性不斷增加,功能日益復雜,涉及的用戶角色也越來越廣泛。在這些系統(tǒng)中,對用戶權(quán)限的統(tǒng)一化、精細化管理,保障系統(tǒng)安全性和數(shù)據(jù)完整性成為亟待解決的問題[1]。
傳統(tǒng)的權(quán)限管理系統(tǒng)要求開發(fā)者手動處理每個資源的訪問控制,缺乏對多應用權(quán)限的統(tǒng)一管理,使得工程處理非常煩瑣且效率低下,導致延長開發(fā)周期,增加開發(fā)成本。用戶需要在多個系統(tǒng)中重復登錄,導致用戶體驗不佳且存在安全隱患。系統(tǒng)之間的權(quán)限認證和用戶信息同步存在障礙,影響了企業(yè)內(nèi)部信息流暢度和工作效率。
為解決上述問題,本文基于角色的訪問控制模型(Role-Based Access Control,簡稱RBAC) [2],使用Spring Security、OAuth2、JWT等技術(shù)框架,設(shè)計研發(fā)了面向多應用的按鈕級權(quán)限管理與用戶統(tǒng)一認證系統(tǒng)。該系統(tǒng)旨在為機構(gòu)提供一種統(tǒng)一、靈活、高效的權(quán)限管理與用戶認證解決方案。開發(fā)者可通過配置方式實現(xiàn)對系統(tǒng)級、菜單級、按鈕級等資源的訪問控制,根據(jù)具體業(yè)務(wù)需求精確控制用戶對系統(tǒng)功能的訪問權(quán)限,有效降低潛在的安全風險,并提高機構(gòu)內(nèi)部應用系統(tǒng)的安全性和管理效率。同時,系統(tǒng)實現(xiàn)了用戶在多個系統(tǒng)中的單點登錄與不同系統(tǒng)間的權(quán)限認證和用戶信息同步[3],提高用戶體驗和工作效率,確保企業(yè)內(nèi)部信息的安全性和一致性。
1 系統(tǒng)整體設(shè)計
該系統(tǒng)采用Spring Security、JWT、OAuth2等技術(shù)架構(gòu)組件,使用MySQL作為數(shù)據(jù)存儲服務(wù)器,Redis作為緩存數(shù)據(jù)服務(wù)器;與業(yè)務(wù)系統(tǒng)通過API方式進行權(quán)限驗證,系統(tǒng)的整體業(yè)務(wù)架構(gòu)如圖1所示。本文的論述重點是多業(yè)務(wù)系統(tǒng)的按鈕級權(quán)限管理以及用戶統(tǒng)一認證功能的實現(xiàn)。結(jié)合圖1,下面分別對權(quán)限管理與用戶統(tǒng)一認證的流程進行闡述。
1.1 用戶統(tǒng)一認證
1) 業(yè)務(wù)系統(tǒng)前端請求業(yè)務(wù)系統(tǒng)后端接口,業(yè)務(wù)后端攔截請求,調(diào)用系統(tǒng)中認證模塊接口進行權(quán)限檢查。如發(fā)現(xiàn)token無效或已過期,返回未登錄信息給業(yè)務(wù)后端,業(yè)務(wù)后端將信息返回給業(yè)務(wù)前端,業(yè)務(wù)前端攜帶應用信息(如:client_id、response_type、redi?rect_uri) 跳轉(zhuǎn)到系統(tǒng)的統(tǒng)一登錄界面。
2) 進入統(tǒng)一認證登錄界面后,登錄頁自動在re?quest header 中攜帶tokenForCode 請求授權(quán)碼接口。
初次登錄用戶須在登錄頁輸入用戶名/密碼,登錄頁再次發(fā)送請求到系統(tǒng)后端。后端校驗clientId是否存在、用戶名/密碼是否正確、當前用戶是否被允許訪問當前client_id的應用。認證通過會生成一個授權(quán)碼code,同時在response header中返回一個tokenForCode 用于維持用戶名/密碼的登錄狀態(tài)[4]。登錄頁將token?ForCode保存下來以備其他業(yè)務(wù)系統(tǒng)自動登錄,同時,將code拼接到redirect_uri中并重定向回redirect_uri。
3) 登錄認證通過后回到業(yè)務(wù)系統(tǒng)redirect_uri,業(yè)務(wù)系統(tǒng)取出code 并攜帶client_id、code 值、grant_type 向業(yè)務(wù)系統(tǒng)后端申請token。業(yè)務(wù)系統(tǒng)后端將接收的參數(shù)以及保存在后端的client_secret拼接到URL中,向系統(tǒng)認證模塊申請token。
4) 系統(tǒng)后臺校驗code有效性(僅可使用1次)、cli?ent_id和client_secret。校驗通過則簽發(fā)JWT token(to?ken payload里聲明了username、user_uuid、client_id、當前token可訪問的業(yè)務(wù)系統(tǒng)集合aud字段等信息)。
5) 業(yè)務(wù)后端接收到系統(tǒng)認證模塊簽發(fā)的token并返回給業(yè)務(wù)前端,業(yè)務(wù)前端獲取token后進行業(yè)務(wù)接口調(diào)用,業(yè)務(wù)后端攔截請求,向系統(tǒng)認證模塊請求進行token校驗、權(quán)限檢查。
6) 業(yè)務(wù)系統(tǒng)B前端請求對應后端接口,其后端同樣攔截請求,向系統(tǒng)認證模塊進行token校驗、權(quán)限檢查,返回未登錄信息。該業(yè)務(wù)后端接收到信息返回給業(yè)務(wù)B前端,業(yè)務(wù)B前端重定向到系統(tǒng)登錄界面。由于業(yè)務(wù)系統(tǒng)A 已經(jīng)登錄,登錄頁自動攜帶token?ForCode 請求code,同時重定向回業(yè)務(wù)系統(tǒng)B 前端。業(yè)務(wù)B無須輸入用戶名/密碼即完成了登錄過程,獲取到授權(quán)碼code,后續(xù)完成與業(yè)務(wù)A相同的其他流程。
1.2 權(quán)限管理
1) 業(yè)務(wù)系統(tǒng)后端攔截業(yè)務(wù)前端界面請求,獲取當前請求的地址(例如/user/search) 和HTTP 方法http?Method(POST) 。后端查詢獲取被訪問接口在系統(tǒng)權(quán)限管理模塊注冊的資源ID resourceId(例如:dciiadmin-server) 和access_token,請求系統(tǒng)權(quán)限管理模塊權(quán)限驗證接口。
2) 系統(tǒng)權(quán)限管理模塊根據(jù)resourceId查詢出當前業(yè)務(wù)系統(tǒng)的路徑匹配規(guī)則集,找到當前接口的認證規(guī)則authentication_type。若當前接口不鑒權(quán)(authentica?tion_type為anonymous) ,則直接通過權(quán)限檢查;若需要鑒權(quán)則取出請求頭里的access_token,校驗token是否被篡改[5],解析其中聲明的信息(例如:username、aud、authorities) 。
3) 根據(jù)username查詢緩存數(shù)據(jù)庫Redis。如查詢結(jié)果為空,則當前token已過期;如有值且兩個token相等,則表示token可用,同時將當前token有效期自動延期。如聲明信息中有aud字段,且傳來的resour?ceId與aud字段值不相等,則返回權(quán)限不足提示。
4) 系統(tǒng)權(quán)限管理模塊提供按鈕權(quán)限獲取接口。業(yè)務(wù)系統(tǒng)在前端界面初始化時調(diào)用此接口,鑒權(quán)通過后,按鈕獲取接口會返回業(yè)務(wù)系統(tǒng)當前界面的按鈕顯示信息。
2 系統(tǒng)功能設(shè)計與實現(xiàn)
本系統(tǒng)的功能設(shè)計采用基于角色的訪問控制模型(RBAC) 。在微服務(wù)架構(gòu)下,應用Hibernate框架嵌入SpringBoot框架中,同時應用Spring Security+JWT實現(xiàn)系統(tǒng)的權(quán)限管理功能,應用OAuth框架實現(xiàn)系統(tǒng)的用戶統(tǒng)一認證功能。系統(tǒng)將用戶關(guān)聯(lián)角色,角色關(guān)聯(lián)權(quán)限,權(quán)限關(guān)聯(lián)應用資源,從而實現(xiàn)賦予用戶相應資源的權(quán)限[6]。如圖2所示,本系統(tǒng)由用戶管理、角色管理、權(quán)限管理、應用管理、統(tǒng)一認證等模塊組成。
2.1 應用管理
應用指接入該系統(tǒng)的其他業(yè)務(wù)系統(tǒng)。應用管理功能包括應用列表、添加編輯應用、頁面管理、按鈕管理、接口管理等功能。
應用列表展示接入該系統(tǒng)的其他業(yè)務(wù)系統(tǒng)信息。用戶可通過應用列表查看和編輯應用詳細信息,設(shè)置應用圖標、應用狀態(tài),獲取應用ID、訪問密鑰,配置應用前后端訪問路徑。如圖3所示。
用戶完成應用注冊后,可通過頁面管理和接口管理分別配置相關(guān)的頁面和接口信息。頁面管理功能支持手動添加和JSON導入兩種方式添加應用下的頁面資源信息,同時提供編輯和下載原始JSON的功能。頁面信息包括id、path、name、component、redirect、meta 等屬性,前端框架通過獲取頁面信息組織頁面的層級結(jié)構(gòu)。當前端已根據(jù)需求將各種組件組成應用后,需要將系統(tǒng)組件映射到路由上,而這些頁面信息即為組成路由表的關(guān)鍵屬性。
在大多數(shù)后臺管理系統(tǒng)中,都需要導航菜單對頁面進行導航。因此,路由表不僅決定了系統(tǒng)頁面的映射關(guān)系,還控制著菜單的排列順序和層級結(jié)構(gòu)。此外,通過接收路由元信息meta屬性,可實現(xiàn)將任意信息附加到路由上,如菜單名稱、菜單圖標等。頁面管理如圖4所示。
頁面結(jié)構(gòu)配置完成后,用戶可以通過按鈕管理功能配置頁面中的按鈕信息。按鈕配置信息包括編碼、說明,前端應用通過編碼信息定位頁面中的按鈕。如圖5所示。
頁面信息配置完成后,用戶可通過接口管理功能設(shè)置應用下的接口信息。接口信息包括所屬應用、匹配規(guī)則、規(guī)則說明、HTTP方法、認證類型以及排序等信息。服務(wù)端應用通過接口信息匹配被訪問的接口,服務(wù)端對用戶接口權(quán)限的鑒權(quán)見系統(tǒng)整體設(shè)計中的權(quán)限管理部分。
2.2 權(quán)限管理
權(quán)限管理用于實現(xiàn)業(yè)務(wù)系統(tǒng)應用功能的合理有序組合。權(quán)限管理功能包括權(quán)限列表、添加編輯權(quán)限、頁面權(quán)限、按鈕權(quán)限、接口權(quán)限。權(quán)限列表展示系統(tǒng)中的全部權(quán)限信息,并提供新增編輯權(quán)限入口。
頁面權(quán)限管理通過應用設(shè)置的頁面結(jié)構(gòu),為用戶提供設(shè)置頁面在某一權(quán)限下是否可見的功能。按鈕權(quán)限管理則通過頁面中設(shè)置的按鈕信息,來設(shè)置按鈕在某一權(quán)限下是否可見。如圖6所示。
接口權(quán)限管理通過應用設(shè)置的API信息,提供用戶設(shè)置接口在某一權(quán)限下是否有權(quán)訪問以及鑒權(quán)方式。如圖7所示。
2.3 角色管理
角色是對權(quán)限的組合,通過設(shè)置用戶角色實現(xiàn)對用戶的權(quán)限授予[7]。角色管理功能包括角色列表、添加角色、權(quán)限設(shè)置。角色列表展示系統(tǒng)中的全部角色信息,并提供新增編輯角色入口。
在角色管理中設(shè)置權(quán)限時,系統(tǒng)分為頁面權(quán)限和接口權(quán)限兩部分。頁面權(quán)限設(shè)置專注于業(yè)務(wù)系統(tǒng)的功能界面、按鈕的訪問控制設(shè)置。接口權(quán)限以單個API為粒度設(shè)置某一角色下接口的訪問控制。
2.4 用戶管理
用戶管理提供用戶信息的展示,用戶注冊、編輯、禁用功能。在用戶注冊時,系統(tǒng)管理員可根據(jù)用戶需求設(shè)置用戶角色,角色可以是單一角色,也可以是多個角色。用戶注冊時提供的用戶名、手機號碼、郵箱均可作為登錄系統(tǒng)時的用戶賬號。
2.5 統(tǒng)一認證
用戶統(tǒng)一認證包括登錄配置和用戶登錄界面。在登錄配置模塊,用戶可以配置系統(tǒng)的登錄界面。配置完成后,通過地址訪問用戶登錄界面,輸入用戶信息后,經(jīng)過系統(tǒng)的統(tǒng)一認證完成用戶登錄操作[8]。統(tǒng)一認證的詳細過程見系統(tǒng)整體設(shè)計中的統(tǒng)一認證模塊。
3 結(jié)論
本系統(tǒng)基于RBAC 模型,結(jié)合Spring Security、OAuth2、JWT等技術(shù)框架,設(shè)計并實現(xiàn)了面向多應用的按鈕級權(quán)限管理與用戶統(tǒng)一認證系統(tǒng)。通過統(tǒng)一管理用戶權(quán)限,實現(xiàn)了對系統(tǒng)級、菜單級、按鈕級等資源的精細化訪問控制,提高了系統(tǒng)的安全性和管理效率。同時,實現(xiàn)了用戶在多個系統(tǒng)中的單點登錄與權(quán)限認證、用戶信息同步,優(yōu)化了用戶體驗和工作效率。本系統(tǒng)為機構(gòu)提供了一種統(tǒng)一、靈活、高效的權(quán)限管理與用戶認證解決方案,為信息系統(tǒng)的安全和發(fā)展提供了有力支持。