前言
若依權(quán)限管理包含兩個(gè)部分:菜單權(quán)限 和 數(shù)據(jù)權(quán)限。菜單權(quán)限控制著我們可以執(zhí)行哪些操作。數(shù)據(jù)權(quán)限控制著我們可以看到哪些數(shù)據(jù)。
菜單是一個(gè)概括性名稱,可以細(xì)分為目錄、菜單和按鈕,以若依自身為例:

- 目錄,就是頁面導(dǎo)航,也可以理解為導(dǎo)航父菜單(二級(jí)導(dǎo)航或三級(jí)導(dǎo)航)如:系統(tǒng)管理;某個(gè)父菜單沒有權(quán)限,表示需要隱藏或禁用這個(gè)父菜單。
- 菜單,就是導(dǎo)航子菜單,如:用戶管理;某個(gè)子菜單沒有權(quán)限,表示需要隱藏或禁用這個(gè)子菜單,也就無法進(jìn)入子菜單關(guān)聯(lián)的頁面,如:用戶管理頁面。
- 按鈕,可以泛化理解為頁面組件,如:新增;某個(gè)組件沒有權(quán)限,表示需要隱藏或禁用這個(gè)組件,也就無法執(zhí)行這個(gè)組件關(guān)聯(lián)的事件,如:點(diǎn)擊。
菜單權(quán)限
菜單權(quán)限是基于 角色 實(shí)現(xiàn)的,如下圖:

菜單授權(quán)
- 創(chuàng)建或編輯菜單時(shí),設(shè)置菜單權(quán)限字符,相當(dāng)于菜單唯一標(biāo)識(shí)符;
- 創(chuàng)建或編輯角色時(shí),設(shè)置該角色擁有權(quán)限的菜單列表,即:角色關(guān)聯(lián)菜單權(quán)限標(biāo)識(shí)符;
- 創(chuàng)建或編輯用戶時(shí),設(shè)置該用戶擁有的角色列表,即:角色關(guān)聯(lián)用戶;
菜單鑒權(quán)
驗(yàn)證用戶對(duì)于菜單是否有權(quán)限,可以通過角色實(shí)現(xiàn):
- 獲取用戶擁有的角色列表;
- 如果角色列表包含這個(gè)角色,則表示有權(quán)限;否則,表示沒有權(quán)限。
也可以通過菜單權(quán)限字符實(shí)現(xiàn):
- 獲取用戶擁有的角色列表;
- 獲取這些角色擁有權(quán)限的菜單(權(quán)限字符)列表;
- 如果菜單列表包含這個(gè)菜單,則表示有權(quán)限;否則,表示沒有權(quán)限。
前端鑒權(quán)
前端使用菜單鑒權(quán)時(shí),需要使用權(quán)限指令:
// 角色
<el-button v-hasRole="['admin']">管理員才能看到</el-button>
// 權(quán)限字符
<el-button v-hasPermi="['system:user:add']">存在權(quán)限字符串才能看到</el-button>
后端鑒權(quán)
前端鑒權(quán)只能保證可以隱藏或禁用菜單,并不能保證菜單關(guān)聯(lián)的后端接口請(qǐng)求不被非法調(diào)用,若依支持在后端接口方法使用角色或權(quán)限字符聲明權(quán)限:
// 角色
@PreAuthorize("@ss.hasRole('user')")
// 權(quán)限字符
@PreAuthorize("@ss.hasPermi('system:user:list')")
若依沒有為后端接口專門設(shè)計(jì)權(quán)限管理模塊,它認(rèn)為后端接口和菜單具有對(duì)應(yīng)關(guān)系,可以直接使用菜單的角色或權(quán)限字符用于后端接口的權(quán)限聲明。
數(shù)據(jù)權(quán)限
數(shù)據(jù)權(quán)限也是基于 角色 實(shí)現(xiàn)的,如下圖:

支持五種權(quán)限模式,按權(quán)限大小依次排列:
- 全部數(shù)據(jù)權(quán)限,表示擁有所有部門的數(shù)據(jù)權(quán)限
- 自定數(shù)據(jù)權(quán)限,表示擁有指定的若干部門的數(shù)據(jù)權(quán)限
- 本部門數(shù)據(jù)權(quán)限,表示僅擁有用戶所屬部門(不包括子部門)的數(shù)據(jù)權(quán)限
- 本部門及以下數(shù)據(jù)權(quán)限,表示僅擁有用戶所屬部門和所有子部門的數(shù)據(jù)權(quán)限
- 僅本人數(shù)據(jù)權(quán)限,表示僅擁有用戶本人的數(shù)據(jù)權(quán)限
數(shù)據(jù)模式需要使用 用戶 和 部門。這就要求我們創(chuàng)建數(shù)據(jù)表時(shí),除業(yè)務(wù)數(shù)據(jù)自身字段以外,需要額外增加兩個(gè)字段:
- userId,表示用戶 ID;
- deptId,表示部門 ID;
用戶可以擁有多個(gè)角色,但只能屬于一個(gè)部門。
部門支持有父子關(guān)系,角色不支持父子關(guān)系。
數(shù)據(jù)授權(quán)
- 創(chuàng)建或編輯部門時(shí),設(shè)置部門父子關(guān)系;
- 創(chuàng)建或編輯角色時(shí),設(shè)置角色的數(shù)據(jù)權(quán)限模式;如果是自定數(shù)據(jù)權(quán)限,需要設(shè)置部門列表;
數(shù)據(jù)鑒權(quán)
數(shù)據(jù)鑒權(quán)實(shí)際是數(shù)據(jù)過濾,即:過濾用戶沒有權(quán)限的數(shù)據(jù)。實(shí)際使用時(shí),我們只需要在查詢數(shù)據(jù)的方法上添加注解:
@DataScope
聲明啟用數(shù)據(jù)過濾即可。這樣若依查詢數(shù)據(jù)時(shí),僅會(huì)返回用戶有權(quán)限的數(shù)據(jù)。
若依對(duì)于使用數(shù)據(jù)權(quán)限的數(shù)據(jù)方法實(shí)現(xiàn)是有一定要求的,我們不描述具體細(xì)節(jié),僅給出核心流程:
- 獲取用戶的角色列表;
- 獲取這些角色的數(shù)據(jù)權(quán)限模式;
- 計(jì)算這些數(shù)據(jù)權(quán)限中的最大權(quán)限;
- 根據(jù)這個(gè)最大權(quán)限,轉(zhuǎn)換成該權(quán)限對(duì)應(yīng)的部門 ID(一個(gè)或多個(gè)) 或 用戶 ID;
- 動(dòng)態(tài)修改查詢數(shù)據(jù)方法的查詢 SQL 語句,添加基于部門 ID 或用戶 ID 的過濾語句;
- 執(zhí)行修改后的查詢 SQL 語句;
可以看出,數(shù)據(jù)權(quán)限本質(zhì)上就是基于部門 ID 或用戶 ID 的數(shù)據(jù)過濾,只是這個(gè)過濾是若依為我們自動(dòng)完成的。
結(jié)語

若依的菜單權(quán)限和數(shù)據(jù)權(quán)限都是基于 角色 實(shí)現(xiàn)的,用戶關(guān)聯(lián)著角色,角色關(guān)聯(lián)著菜單權(quán)限字符和數(shù)據(jù)權(quán)限模式。
浙公網(wǎng)安備 33010602011771號(hào)