1.RBAC模型
一.什麼是RBAC
- 權限系統提的最多的就是 RBAC(Role-Based Access Control 基于角色的通路控制)。 所謂角色,其實就是權限的集合,某個角色就是某幾個權限的結合。其目的是為了簡化授權和鑒權的過程。
二.表結構分析
- 企業開發中 RBAC模型設計為7張表,其中4張為基礎表,3張為中間表。
-
使用者與角色
使用者和角色為多對多關系,通過使用者角色中間表關聯
tb_admin 管理者表:
tb_role 角色表: tb_admin_role 管理者角色中間表: -
角色與權限
角色和權限為多對多關系,通過角色權限中間表關聯
tb_role 角色表:
tb_resource 權限表(資源表): tb_role_resource 角色資源中間表: -
權限與菜單
權限和菜單為多對多關系,通過權限菜單中間表關聯
tb_resource 權限表(資源表):
tb_menu 菜單表: tb_resource_menu 資源菜單中間表:
2.管理者角色設定
一.需求分析
- 管理者和角色為多對多關系,在儲存管理者時實作對管理者角色中間表的添加。
二.思路分析
- 送出角色設定
- 建立管理者角色中間表的實體類和資料通路接口
- 建立組合實體類,包含管理者實體類和角色ID集合兩個屬性
- 修改管理者實體類,為id添加以下注解可以辨別該主鍵為自增
- 修改管理者add方法,取出管理者實體儲存,取出角色ID集合,循環添加到管理者角色中間表。
- 注意在儲存管理者密碼時需要對密碼進行bcrypt加密。
- “所屬角色”使用elementui的select選擇器 ,為 el‐select 設定 multiple 屬性即可啟用多選
- 讀取角色設定
- 修改findById方法的傳回值為組合實體類,修改其中的邏輯,組合實體類的角色id集合需要查詢管理者角色中間表。
- 修改update方法,删除原來的相關的中間表資料,再循環添加中間表資料。
- 讀取後需要把密碼屬性設定為null, 如果使用者沒有在界面輸入密碼則保持密碼不變,如果填寫了密碼需要進行bcrypt加密。
3.角色權限設定
一.需求分析
- 顯示所有的權限清單,并自動勾選已經儲存的權限。使用者勾選權限後,點選送出,将勾選的權限id送出給後端儲存
二.思路分析
- 送出權限設定
- 建立角色權限中間表的實體類和資料通路接口
- 前後端約定要送出的資料格式,包括“角色id”和“權限id清單”。根據約定的資料格式建立組合實體類。
- 後端添加方法,接收組合實體類參數,提取“角色id”和“權限id清單”,循環讀取權限id插入到角色權限中間表中。
- 讀取權限設定
- 後端查詢權限表(資源表),以樹狀結構傳回資料。前端使用兩層v-for循環輸出清單。
- 後端添加方法,根據角色查詢權限id清單,前端擷取權限id清單後實作複選框的勾選。
4.使用者權限設定
一.需求分析
- 當使用者執行一個不存在的權限的url,需要攔截請求。
二.spring security授權控制
-
基于URL通路控制
在UserDetailsServiceImpl的loadUserByUsername方法,實作對目前使用者的授權
修改applicationContext_security.xmlhasAnyAuthority():擁有任意權限都可以通路
hasAuthority('brand'): 擁有brand的權限可以通路
hasAnyAuthority('goods_add','goods_edit')" :擁有goods_add和goods_edit其中一個權限就可以通路
-
基于方法的通路控制
對目前使用者授權,同上 ,對方法的通路控制如下:
- 修改applicationContext_security.xml ,增加配置 ,啟用注解
- 在進行權限控制的方法上添加注解
三.思路分析
- 編寫SQL語句,通過登入名查詢資源KEY清單
- 資料通路接口新增方法,根據登入名查詢資源KEY清單
- 服務層實作根據登入名查詢資源KEY清單
-
UserDetailsServiceImpl的loadUserByUsername方法,調用根據登入名查詢資源KEY清單的方法,将資源key清單添加到當
前使用者。
- )修改applicationContext_security.xml,添加對url的攔截,或在方法上添加注解實作對方法的攔截。
5.使用者菜單篩選
一.需求分析
- 使用者登入後進入主界面,顯示的菜單為使用者所擁有的權限關聯的菜單。不具有權限的菜單不顯示。
二.思路分析
- 編寫SQL語句,根據目前登入名擷取菜單清單的方法 注意通過上述語句,擷取的菜單清單隻包含三級菜單,而我們需要傳回包括一級菜單、二級菜單和三級菜單的菜單清單。隻要三級菜單存在,就要有它的二級菜單;隻要有一個二級菜單就要有它的一級菜單。
- 查詢二級菜單清單:
- 查詢一級菜單清單:
- 最後我們通過UNION運算符将三個語句連接配接成一條語句
- 将上述SQL封裝為查詢方法
- 在controller擷取目前使用者名,調用上述查詢方法。