?

基于Spring Security的權限管理系統的設計與實現

2024-01-14 09:54蘇兵
電腦與電信 2023年9期
關鍵詞:菜單按鈕分配

蘇兵

(廣東培正學院數據科學與計算機學院,廣東 廣州 510830)

1 引言

計算機技術日新月異,為了對特定的網絡資源進行有效的保護,需要對任何投入運營的信息系統增加更高的安全模塊,如身份驗證、授權和加密方式等,從而防止數據泄露等問題[1]。在未使用安全框架之前,開發者需要手動地處理每個資源的訪問控制,然而,針對不同的開發項目,又往往需要做出不同的處理,使得整個工程操作起來非常繁瑣且低效率,進而引起更多額外的開銷,導致延緩開發周期,增加開發成本。使用Spring Security與JWT,開發者可通過配置的方式實現對特定資源的訪問限制,用戶信息在各方傳輸時,通過JWT對數據加密后形成token,用來進行用戶認證,確保用戶的合法性[2-3]。該信息安全解決方案開發更加高效,且復用性高、維護開本低,深受國內外知名互聯網公司青睞。

2 系統的整體設計

該權限管理系統有三類服務器:Web 服務器、數據庫服務器和緩存服務器,客戶端為PC 端和移動端,如圖1 所示。Web 服務器后端采用微服務架構,關鍵技術為Spring Boot、MyBatis-plus、Spring Security 和JWT,緩存服務器采用Redis 高速緩存技術,數據庫服務器采用關系型數據庫MySQL,前端采用Vue.js和Element-Plus等技術。

圖1 系統的整體設計

本文論述的重點是在Web服務器中應用Spring Security的功能,從而更好地保護Web 服務器的資源,以免被非法訪問或攻擊?;趯ΡWo命令方式或反應式應用程序的有效支持,Spring Security可以作為一種提供身份驗證、授權及防范攻擊的功能性框架,更是作為保護基于Spring所開發應用程序的一種常用標準[4]。通過對Spring Security 的規范應用,進而使開發者更自如地實現對安全功能的標準集成,例如:對用戶角色的權限管理,以此達到保護應用程序免遭嚴重攻擊和非法訪問的目的。下面對Web服務器中的Spring-Security安全組件進行分析:

(1)AuthenticationManager:負責認證管理,解析用戶登錄信息(封裝在Authentication),讀取用戶、角色、權限信息進行認證,認證結果被回填到Authentication,保存在Securi-tyContext。

(2)AccessDecisionManager:負責授權投票表決,匯總投票器的結果,實現一票通過(默認)、多票通過、一票否決策略。

(3)SecurityInterceptor:負責權限攔截,包括Web URL攔截和方法調用攔截。通過ConfigAttributes 獲取資源的描述信息,借助于AccessDecisionManager進行授權攔截。

(4)SecurityContext:安全上下文,保存認證結果。提供了全局上下文、線程繼承上下文、線程獨立上下文(默認)三種策略。

(5)Authentication:認證信息,保存用戶的身份標示、權限列表、證書、認證通過標記等信息。

(6)SecuredResource:被安全管控的資源,如Web URL、用戶、角色、自定義領域對象等。

(7)ConfigAttributes:資源屬性配置,描述安全管控資源的信息,為SecurityInterceptor提供攔截邏輯的輸入。

JSON Web Token(JWT)是一個開放式的標準(RFC 7519),其定義了一種緊湊且自包含的方式,用于作為JSON對象在各程序之間安全可靠地傳輸信息,該信息因經過數字簽名,故可實現有效驗證與事物的可信任性[5]。本系統采用JWT技術對用戶信息進行加密處理,提高數據的安全性。為了實現前后端分離的設計模式,系統的前端在node.js運行環境下開發,后端則采用主流微服務架構。當用戶通過客戶端登錄系統時,系統將會自動啟動Spring Security 對用戶的身份進行認證,當身份認證成功后,再通過JWT對用戶加密后形成token,用戶請求其他資源時只需攜帶token 即可,后端會通過token來識別用戶身份。

3 基于角色的權限管理設計

本系統的數據庫設計采用基于角色的訪問控制模型(RBAC),在微服務架構下應用MyBatis-plus 框架嵌入到Spring Security 安全框架中,通過這種方式可以將用戶關聯角色,角色關聯權限,從而間接地實現賦予用戶相應的權限。如圖2 所示,本系統的RBAC 模塊由三部分組成:用戶管理、角色管理和權限管理。

圖2 RBAC模塊功能

針對RBAC 模塊功能,本系統數據庫需設計5 張表:用戶表、角色表、菜單表、用戶角色中間表和角色菜單中間表。如圖3 所示,用戶表主要用于存儲用戶身份信息;角色表主要用于存儲用戶的角色信息;菜單表主要用于實現存儲用戶顯示的菜單和擁有的權限,主要包括菜單名、訪問權限和訪問接口等字段;用戶和角色中間表功能主要用于實現能將用戶與角色關聯起來,實現用戶與角色多對多的關系;角色和菜單中間表主要用于定義某個角色可以訪問哪些菜單。由于本系統采用Mybatis-plus 框架來關聯Web 應用與數據庫實現CRUD 操作,無需在數據庫的表設計中添加外鍵,Mybatis-plus 默認使用生成ID,在項目的配置文件中配置即可。

圖3 數據庫物理模型

4 權限管理核心功能的實現

該權限管理系統將論述前端和后端的核心功能的實現過程。前端核心功能則是采用Vue.js 與Element-Plus 等技術簡化UI 開發工作。Vue 基于標準HTML、CSS 和JavaScript 構建,并提供了一套聲明式的、組件化的編程模型,幫助開發者高效地開發用戶界面[6]。Element-Plus 是一個基于Vue.js 的企業級UI 組件庫,它包含了很多常用的UI 組件,如表格、表單、按鈕、彈框等,可大大簡化UI 開發工作。后端核心功能是采用Spring Security 與JWT 等技術實現對特定資源的訪問,充分應用Spring Security 的認證和授權功能。后端核心功能類分別保存在配置包config 和控制器包controller中,如圖4所示。

圖4 后端核心功能類

4.1 身份認證的實現

4.1.1 身份認證前端的實現

身份認證之前需先通過表單收集登錄用戶的用戶名和密碼,如圖5 所示,當用戶輸入完用戶名和密碼后,還需在“驗證碼”輸入框輸入其右邊隨機產生的字母圖形碼,防御通過機器人高頻率地訪問服務器,同時也可勾選表單左下角的“記住密碼”單選框對當前密碼進行保存,方便下次登錄系統。若輸入的信息都正確,點擊“登錄”按鈕即可成功登錄系統。

圖5 系統登錄頁面

“登錄”按鈕的功能是該登錄頁面的核心功能,關鍵的javascript代碼如下所示:

用戶成功登錄后會在瀏覽器的會話存儲器中保存相應的數據,特別是token,如圖6所示。

圖6 會話存儲器中保存的數據

4.1.2 身份認證后端的實現

后端采用Spring Security 對用戶身份進行認證,其認證功能是驗證試圖要訪問特定資源的人的身份,而授權則是用來確定允許誰可以訪問特定的資源的作用。Spring Security 的深度防御措施則可以通過允許基于請求的授權和基于方法的授權來實現這一功能。

(1)用戶身份認證環節的實現過程:當用戶登錄成功后,Web 服務器會根據設定的算法和JWT 的結構生成一個token,并將該token 返回給客戶端,此時,token 將存儲在緩存服務器中。接下來,客戶端接收到信息,再根據Web 服務器來實現返回該用戶所能訪問的前端菜單的動態加載頁面,從而實現為不同角色顯示不同的頁面效果的功能。當用戶進行第二次登錄時,只需要帶上上一次服務器所返回的token 即可,無需再次進行賬號和密碼的驗證。也就是說,系統此時只需要從用戶提交的token當中去獲取該用戶的用戶名,然后再從Redis服務器中通過這個用戶名拿到一個token。如果此時的token相同,則開始檢驗該token是否過期,如果已經過期則會重新生成一個新的token。下面將通過2個類的部分功能來論證用戶身份的認證過程。

控制層的“SysUserController.java”用戶控制器類主要實現對用戶名進行驗證,代碼及其關鍵注釋如下:

(2)對特定資源訪問授權的實現過程:當用戶成功登錄后,需要對其他的頁面或資源進行訪問,但由于token中包含了用戶的基本信息和所能訪問的資源,因此每次進行資源訪問時,用戶也只需要帶上token即可。用戶可以通過token獲取來用戶名,再通過用戶名訪問數據庫,進而查詢該用戶是否有訪問該API資源的權限,如果該用戶擁有訪問該資源的權限,就繼續正常往下執行,否則將返回無權訪問的提示。

當用戶成功通過Spring Security 安全框架的認證和授權,程序的業務邏輯層會根據用戶ID 獲取用戶權限信息,代碼如下所示,程序運行時從控制臺輸出所獲權限結果,如圖7所示。

圖7 控制臺輸出所獲權限結果

4.2 對用戶分配角色的實現

4.2.1 分配角色前端的實現

當登錄用戶的身份通過驗證后即可進入到系統的首頁。用戶通過點擊左側菜單“用戶管理”進入用戶管理頁面,該頁面的功能非常豐富,如搜索用戶信息、新增用戶和對用戶進行分配角色等,如圖8所示。

圖8 用戶管理界面

由于用戶需求的改變,要求將test02 用戶增加“普遍角色”。為了實現該功能,需點擊“分配角色”按鈕,便彈出如圖9 所示的對話框,當選擇完所需角色后,點擊“確定”按鈕即可實現。該按鈕核心的javascript代碼和注釋如下:

圖9 對指定用戶分配角色1

如圖10 所示為成功地對test02 用戶分配角色后的前面效果。

圖10 指定用戶分配角色2

4.2.2 分配角色后端的實現

對指定用戶分配角色主要在系統用戶控制類“SysUser-Controller.java”的grantRole()方法上實現,如下代碼所示,需同時對該方法添加3 個注釋:啟用數據庫事務處理的@Transactional;提交數據的影射@PostMapping,其路徑參數中采用RESTful 架構來傳遞userId;@PreAuthorize 為用前授權判斷,要求訪問該方法前必須擁有訪問角色的權限。

4.3 對角色權限分配的實現

4.3.1 對角色權限分配前端的實現

對于權限管理系統,給指定的角色進行權限分配顯得非常重要功能之一。當在“角色管理”頁面中點擊“普通角色”的“分配權限”按鈕后,便彈出如圖11 所示的“分配權限”對話框,從中查看到“普通角色”的權限比較少,僅有對用戶和角色進行查詢,及訪問業務的權限。根據系統功能需求,要對其添加權限:用戶新增、重置密碼和菜單查詢,則勾選如圖12 所示的對話框,最后點擊“確認”按鈕即可完成?!按_認”按鈕的javascript代碼和注釋如下:

圖11 對角色分配權限前

圖12 對角色分配權限后

4.3.2 對角色權限分配后端的實現

通過控制層的“SysRoleController.java”定義update-Menus()方法來處理前端提交的數據,該方法能實現更新角色權限信息。由于該方法需對數據庫進行寫操作,為保證數據的原子性,給該方法添加事務處理注解@Transactional,同時在所請求的url 中采用了RESTful 架構,方便對處理前端傳來的數據。以下為對角色權限分配實現的Java代碼:

4.4 對菜單配置權限的實現

4.4.1 對菜單配置權限前端的實現

為菜單配置相應的權限是本系統的核心功能之一,先前的功能必須獲取相應的權限才能執行。下面將論述為“用戶管理”新建權限分配的前端實現。當進入“權限管理”頁面后,系統將查詢出各級“菜單名稱”的“權限標識”等信息,現需為“用戶管理”新建一個用于“test 用戶查詢”的權限“system:user:query”,如圖13所示,點擊“確認”按鈕后,成功地完成其權限的新建,如圖14所示?!按_認”按鈕的javascript代碼和注釋如下:

圖13 權限分配中

圖14 權限分配后

4.4.2 對菜單配置權限后端的實現

后端為了響應前端對菜單添加或者修改權限的操作,需在控制層的“SysMenuController.java”類中定義save()方法來保存該操作的結果。該方法需添加2 個注解:用于url路由的@PostMapping;使用方法前需獲取添加和編輯的權限@PreAuthorize。該方法接收的“SysRole”對象前需添加2 個注解:@RequestBoday 表示該對象應該綁定到web 請求的主體;@Valid 表示標記用于級聯驗證的屬性、方法參數或方法返回類型。對菜單進行權限分配的核心Java 代碼和注釋如下:

5 結語

本系統基于Spring Security 安全框架搭建了一套安全可靠的權限管理系統,系統的實現采用了RBAC 模型、Mybatis-plus 框架和JWT 等技術,并結合Vue.js 和Element-Plus 等技術實現系統的前后端分離功能設計。本系統應用了微服務構架設計,減輕了后端服務器的運算速度,降低了數據存儲產生的壓力,同時,對外來的非法訪問攻擊產生防范作用,為信息系統實現了可靠的安全認證與授權管理等功能,更便于后續的移植與維護。

猜你喜歡
菜單按鈕分配
當你面前有個按鈕
中國新年菜單
應答器THR和TFFR分配及SIL等級探討
遺產的分配
一種分配十分不均的財富
績效考核分配的實踐與思考
死循環
本月菜單
內心不能碰的按鈕
一個“公海龜”的求偶菜單
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合