前後端分離如何做許可權控制設計? java shiro項目重啟后需要重新登錄

2023-12-01

近幾年隨著react、angular、vue等前端框架興起,前後端分離的架構迅速流行。但同時許可權控制也帶來了問題。

網上很多前、後端分離許可權僅僅都僅僅在描述前端許可權控制、且是較簡單、固定的角色場景,滿足不了我們用戶、角色都是動態的場景。

且僅僅前端進行許可權控制並不是真正意義的許可權控制,它只是減少頁面結構暴露、增強用戶體驗的功效。

場景

系統為後台管理系統,包含了用戶創建、用戶登錄、用戶管理自己的資源。用戶經常會新增、刪除,也可以根據工作情況隨時調整頁面、功能許可權,所以採用用戶-角色-頁面許可權方案實現。

為什麼不行:

根據前端路由表顯示左側菜單,但vue-router的路由表主要為了組織代碼,經常我們所需要的菜單並非一致。比如某個前端路由a子路由有b、c,但菜單中我們想要直接一級菜單就顯示b、c或者將b、c各放到其他菜單下。所以這種非常不靈活。一個路由是菜單還是頁面?是否需要顯示到菜單中?是否驗證許可權?哪個角色或者用戶擁有許可權?這些都需要寫到前端路由裡面,一旦有任何許可權變動就要大量調整代碼。如果許可權寫死在前端,那麼角色或者用戶必須已知且固定不變。比如頁面1的meta增加屬性標識可訪問的角色為a和b

頁面

一個頁面即一個前端頁面,比如首頁、用戶管理頁、資源管理頁等。

基本思路為:前端路由保持不變,資料庫存儲菜單結構、頁面許可權控制(可以直接做成一個頁面來方便管理)等,前端根據資料庫中的菜單結構和許可權信息來渲染一個菜單出來並只顯示其有許可權的菜單,並在路由守衛中進行許可權控制防止手動輸入path越權打開頁面。

前端路由(vue-router)中需要正常創建頁面及路由。資料庫存儲菜單結構和頁面許可權信息,菜單(目錄、非內容頁)可以自己創建,不必要求前端路由中有,因為這是指菜單的可視化的組織結構頁面(內容頁)必須是前端路由中已有頁面,因為這是用戶需要訪問的內容。菜單和頁面組成上下級關係,一級可以是菜單也可以是內容頁,內容頁也可以放在菜單下,這樣理論(需要頁面菜單樣式支持)可以組成無限級菜單菜單和頁面的基本屬性包括title(對應路由title)、name(對應路由name)、path(對應路由path)、父級、類型(菜單/頁面)、是否可見(左側菜單欄是否顯示:部分頁面可能是頁面內的

【本文地址】