說明:之前寫過一篇博客,介紹如何搭建一個基于角色的權限驗證框架
- 搭建一個基于角色的權限驗證框架
本文介紹在非常受歡迎的開源框架——芋道中是如何實現 RBAC 的,芋道的部署參考下面這篇文章:
- 芋道微服務代碼部署
介紹
一般來說,系統內用戶權限分以下兩類,RBAC(基于角色的權限驗證)對應的是第一類。
-
菜單權限:用戶能看到那些菜單,與用戶所擁有的角色掛鉤;
-
數據權限:用戶能看到那些數據,與用戶所處的部門掛鉤;
(1)數據庫表設計
五張表,三張實體表,兩張映射表。通過給角色賦予菜單,用戶賦予角色來控制用戶所能訪問的菜單,RBAC 的基礎操作
(2)接口設計
用戶賦予角色,角色賦予權限接口
實際上就是往兩張映射表里寫數據
(3)接口校驗
用戶僅能看到所擁有角色權限內的菜單,需要前端和后端共同實現,前端僅展示當前用戶能看到的菜單(包括按鈕),后端需要給每個接口設置權限標識,沒有權限的用戶訪問接口會被攔截。
看芋道是怎么實現的?下面這個接口返回了當前用戶權限信息,包括了用戶信息、角色信息和菜單權限信息
前端通過返回的數據,展示對應的菜單和按鈕。另外,在管理員或者擁有修改某角色權限的用戶修改角色的菜單權限時,保證對應角色用戶的權限能實時生效,前端可以控制調用該接口的時機。
也就是什么時候調用該接口?是登錄時調用一次,還是進入菜單,展示內容前先調用查一遍?這決定了角色權限生效的時效。
在后端,需要給每個按鈕對應訪問的接口設置權限標識,并在用戶訪問時判斷當前用戶是否擁有該權限。如下,
點進去,查看實現,也還是通過當前用戶 ID + 權限標識判斷
hasAnyPermissionsCache
是用戶 ID 對應權限的 Map 集合,使用了本地緩存,過期時間 1 分鐘
查看數據來源,也就是用用戶 ID 去查了數據庫,獲取當前用戶的所有角色
查出角色后再查角色所擁有的權限,挨個與當前傳入的權限標識比較,看在不在這里面
(4)設置當前用戶
這里,在校驗 token 的攔截器中,將當前用戶信息設置到上線文中
這里放了 用戶 ID 和用戶 Type,如果你需要用到用戶的其他信息,如 用戶名、性別等,也可以在這里加
擴展
這里演示新增一個接口,加入到 RBAC 校驗體系中。
(1)新增按鈕
在系統設置中,新增一個按鈕,這里可以選按鈕所在的上級菜單,及該按鈕在哪個頁面里,再設置一個權限標識,這個標識前端用于判斷是否展示按鈕,后端用于校驗用戶是否擁有訪問權限,所以前后端要約定好。
(2)開發接口
接著,后端程序員就去開發自己的接口,開發完后,在接口上加上這行校驗注解
(3)測試
創建一個角色,將該權限不賦予給這個角色
再將這個角色賦予給某個用戶
設置完,前端應該不會給這個用戶展示這個按鈕,使用 apifox 用該用戶的 token 調用該接口,提示沒有操作權限
總結
本文介紹了在芋道框架中 RBAC 實現的細節