若依-权限

权限

权限系统是一个系统中非常重要的部分,不同的角色对于系统拥有着不同的操作权限或者操作界面或者其他。本文主要记录若依框架的权限使用。

效果

一个具体案例:假如我们给超级管理员一个导出的权限,普通角色则没有导出权限,即:

普通角色

管理员界面

具体实现

准备工作

定义角色

进入角色管理,添加自己的角色,具体步骤略

角色

添加用户

进入用户管理,添加自己的用户,指定相应的角色,具体步骤略

用户

至此,使用权限的准备工作已经做好。同时,确保你使用过代码生成模块中的SQL文件将相应的权限数据导入了数据库中。就比如这里的导出功能,你可以进入菜单管理来查看或者直接查看数据库

导出功能

代码实现

前端
1
2
3
4
<el-button
v-hasPermi="['qljsystem:contract:export']"
v-hasRole="['admin']">导出
</el-button>

使用权限字符串 v-hasPermi

1
2
3
4
// 单个
<el-button v-hasPermi="['system:user:add']">存在权限字符串才能看到</el-button>
// 多个
<el-button v-hasPermi="['system:user:add', 'system:user:edit']">包含权限字符串才能看到</el-button>

使用角色字符串 v-hasRole

1
2
3
4
// 单个
<el-button v-hasRole="['admin']">管理员才能看到</el-button>
// 多个
<el-button v-hasRole="['role1', 'role2']">包含角色才能看到</el-button>
后端
1
2
3
4
5
6
7
8
9
@PreAuthorize("@ss.hasPermi('qljsystem:contract:export')")
@Log(title = "合同导出", businessType = BusinessType.EXPORT)
@GetMapping("/export")
public AjaxResult export(QljContract qljContract)
{
List<QljContract> list = qljContractService.selectQljContractList(qljContract);
ExcelUtil<QljContract> util = new ExcelUtil<QljContract>(QljContract.class);
return util.exportExcel(list, "qljcontract");
}

数据权限示例

1
2
3
4
5
6
7
8
// 符合system:user:list权限要求
@PreAuthorize("@ss.hasPermi('system:user:list')")

// 不符合system:user:list权限要求
@PreAuthorize("@ss.lacksPermi('system:user:list')")

// 符合system:user:add或system:user:edit权限要求即可
@PreAuthorize("@ss.hasAnyPermi('system:user:add,system:user:edit')")

角色权限示例

1
2
3
4
5
6
7
8
// 属于user角色
@PreAuthorize("@ss.hasRole('user')")

// 不属于user角色
@PreAuthorize("@ss.lacksRole('user')")

// 属于user或者admin之一
@PreAuthorize("@ss.hasAnyRoles('user,admin')")

表格字段权限控制

由于目前若依框架没有提供,因此使用v-if和全局判断函数来手动设置

一、前端字段设置

1
2
3
4
<!-- 角色权限 -->
<el-table-column label="合同号" prop="contractNum" v-if="checkRole(['admin'])"/>
<!-- 数据权限 -->
<el-table-column label="合同号" prop="contractNum" v-if="checkPermi(['system:user:add', 'system:user:edit'])"/>

二、导入全局判断函数

1
import { checkPermi, checkRole } from "@/utils/permission";

三、设置函数

1
2
3
4
5
6
export default{
methods: {
checkPermi,
checkRole
}
}

表格数据权限控制

前一个表格字段权限控制控制的是,本部分介绍下我是怎么实现的权限控制

效果

管理员界面

技术人员界面

如何实现

思路:获取当前登录用户,如果角色为技术人员,则筛选出权限内的数据

获取登录用户的角色
1
2
3
4
/** 当前登录用户角色 */
loginUserRoleIs(param) {
return this.$store.state.user.roles.indexOf(param) !== -1
},
筛选函数

此段代码可以参考本文

1
2
3
filterArray(aim, reg) {
return aim.filter(item => item.docType === reg)
}
筛选数据

此段代码可以参考本文

1
2
3
4
5
6
getContractDocList() {
getContractdoc(this.formData.id).then(response => {
this.docList = this.loginUserRoleIs('tech') ? this.filterArray(response.data, 2) : response.data;
this.total = this.docList.length;
})
},

常见问题

提示您没有数据权限

这种情况都属于权限标识配置不对,需要在菜单管理配置好权限标识(菜单&按钮)

  1. 确认此用户是否已经配置角色

    确认此用户是否已经配置角色

  2. 确认此角色是否已经配置菜单权限

    确认此角色是否已经配置菜单权限

  3. 确认此菜单权限标识是否和后台代码一致

如参数管理
后台配置@PreAuthorize("@ss.hasPermi('system:config:query')")对应参数管理权限标识为system:config:query

注:如需要角色权限,配置角色权限字符 使用@PreAuthorize("@ss.hasRole('admin')")