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

?

基于Spring Security的權(quán)限管理系統(tǒng)的設(shè)計與實現(xiàn)

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

蘇兵

(廣東培正學(xué)院數(shù)據(jù)科學(xué)與計算機(jī)學(xué)院,廣東 廣州 510830)

1 引言

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

2 系統(tǒng)的整體設(shè)計

該權(quán)限管理系統(tǒng)有三類服務(wù)器:Web 服務(wù)器、數(shù)據(jù)庫服務(wù)器和緩存服務(wù)器,客戶端為PC 端和移動端,如圖1 所示。Web 服務(wù)器后端采用微服務(wù)架構(gòu),關(guān)鍵技術(shù)為Spring Boot、MyBatis-plus、Spring Security 和JWT,緩存服務(wù)器采用Redis 高速緩存技術(shù),數(shù)據(jù)庫服務(wù)器采用關(guān)系型數(shù)據(jù)庫MySQL,前端采用Vue.js和Element-Plus等技術(shù)。

圖1 系統(tǒng)的整體設(shè)計

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

(1)AuthenticationManager:負(fù)責(zé)認(rèn)證管理,解析用戶登錄信息(封裝在Authentication),讀取用戶、角色、權(quán)限信息進(jìn)行認(rèn)證,認(rèn)證結(jié)果被回填到Authentication,保存在Securi-tyContext。

(2)AccessDecisionManager:負(fù)責(zé)授權(quán)投票表決,匯總投票器的結(jié)果,實現(xiàn)一票通過(默認(rèn))、多票通過、一票否決策略。

(3)SecurityInterceptor:負(fù)責(zé)權(quán)限攔截,包括Web URL攔截和方法調(diào)用攔截。通過ConfigAttributes 獲取資源的描述信息,借助于AccessDecisionManager進(jìn)行授權(quán)攔截。

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

(5)Authentication:認(rèn)證信息,保存用戶的身份標(biāo)示、權(quán)限列表、證書、認(rèn)證通過標(biāo)記等信息。

(6)SecuredResource:被安全管控的資源,如Web URL、用戶、角色、自定義領(lǐng)域?qū)ο蟮取?/p>

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

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

3 基于角色的權(quán)限管理設(shè)計

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

圖2 RBAC模塊功能

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

圖3 數(shù)據(jù)庫物理模型

4 權(quán)限管理核心功能的實現(xiàn)

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

圖4 后端核心功能類

4.1 身份認(rèn)證的實現(xiàn)

4.1.1 身份認(rèn)證前端的實現(xiàn)

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

圖5 系統(tǒng)登錄頁面

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

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

圖6 會話存儲器中保存的數(shù)據(jù)

4.1.2 身份認(rèn)證后端的實現(xiàn)

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

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

控制層的“SysUserController.java”用戶控制器類主要實現(xiàn)對用戶名進(jìn)行驗證,代碼及其關(guān)鍵注釋如下:

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

當(dāng)用戶成功通過Spring Security 安全框架的認(rèn)證和授權(quán),程序的業(yè)務(wù)邏輯層會根據(jù)用戶ID 獲取用戶權(quán)限信息,代碼如下所示,程序運(yùn)行時從控制臺輸出所獲權(quán)限結(jié)果,如圖7所示。

圖7 控制臺輸出所獲權(quán)限結(jié)果

4.2 對用戶分配角色的實現(xiàn)

4.2.1 分配角色前端的實現(xiàn)

當(dāng)?shù)卿浻脩舻纳矸萃ㄟ^驗證后即可進(jìn)入到系統(tǒng)的首頁。用戶通過點擊左側(cè)菜單“用戶管理”進(jìn)入用戶管理頁面,該頁面的功能非常豐富,如搜索用戶信息、新增用戶和對用戶進(jìn)行分配角色等,如圖8所示。

圖8 用戶管理界面

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

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

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

圖10 指定用戶分配角色2

4.2.2 分配角色后端的實現(xiàn)

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

4.3 對角色權(quán)限分配的實現(xiàn)

4.3.1 對角色權(quán)限分配前端的實現(xiàn)

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

圖11 對角色分配權(quán)限前

圖12 對角色分配權(quán)限后

4.3.2 對角色權(quán)限分配后端的實現(xiàn)

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

4.4 對菜單配置權(quán)限的實現(xiàn)

4.4.1 對菜單配置權(quán)限前端的實現(xiàn)

為菜單配置相應(yīng)的權(quán)限是本系統(tǒng)的核心功能之一,先前的功能必須獲取相應(yīng)的權(quán)限才能執(zhí)行。下面將論述為“用戶管理”新建權(quán)限分配的前端實現(xiàn)。當(dāng)進(jìn)入“權(quán)限管理”頁面后,系統(tǒng)將查詢出各級“菜單名稱”的“權(quán)限標(biāo)識”等信息,現(xiàn)需為“用戶管理”新建一個用于“test 用戶查詢”的權(quán)限“system:user:query”,如圖13所示,點擊“確認(rèn)”按鈕后,成功地完成其權(quán)限的新建,如圖14所示。“確認(rèn)”按鈕的javascript代碼和注釋如下:

圖13 權(quán)限分配中

圖14 權(quán)限分配后

4.4.2 對菜單配置權(quán)限后端的實現(xiàn)

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

5 結(jié)語

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

猜你喜歡
菜單按鈕分配
當(dāng)你面前有個按鈕
中國新年菜單
應(yīng)答器THR和TFFR分配及SIL等級探討
遺產(chǎn)的分配
一種分配十分不均的財富
績效考核分配的實踐與思考
死循環(huán)
本月菜單
美食堂(2017年1期)2017-01-13 01:37:42
內(nèi)心不能碰的按鈕
一個“公海龜”的求偶菜單
鴨綠江(2013年10期)2013-03-11 19:41:55
平江县| 阳泉市| 泰州市| 盘山县| 屏东县| 广昌县| 苗栗市| 恩施市| 涞源县| 清远市| 田东县| 白银市| 洛宁县| 大邑县| 蓝田县| 子长县| 沙河市| 本溪市| 昔阳县| 宣武区| 鹤庆县| 百色市| 汉中市| 莎车县| 息烽县| 五莲县| 积石山| 仙桃市| 彩票| 南宁市| 沁阳市| 图木舒克市| 延长县| 句容市| 郴州市| 邛崃市| 白银市| 鲜城| 隆尧县| 新平| 漳州市|