第一种方式:自定义数据权限规则
步骤一:权限控制接口
public interface DataPermissionRule {
1./**
* 返回需要生效的表名数组
* 为什么需要该方法?Data Permission 数组基于 SQL 重写,通过 Where 返回只有权限的数据
*
* 如果需要基于实体名获得表名,可调用 {@link TableInfoHelper#getTableInfo(Class)} 获得
*
* @return 表名数组
*/
Set<String> getTableNames();
/**
* 根据表名和别名,生成对应的 WHERE / OR 过滤条件
*
* @param tableName 表名
* @param tableAlias 别名,可能为空
* @return 过滤条件 Expression 表达式
*/
Expression getExpression(String tableName, Alias tableAlias);
}
步骤二:实现权限控制接口
2.
@Component // 声明为 Spring Bean,保证被 yudao-spring-boot-starter-biz-data-permission 组件扫描到
public class DemoDataPermissionRule implements DataPermissionRule {
@Override
public Set<String> getTableNames() {
return Sets.newHashSet("system_dict_type", "system_post");
}
@Override
public Expression getExpression(String tableName, Alias tableAlias) {
Long userId = SecurityFrameworkUtils.getLoginUserId();
assert userId != null;
switch (tableName) {
case "system_dict_type":
// 处理权限逻辑根据业务需求进行更改
return new EqualsTo(MyBatisUtils.buildColumn(tableName, tableAlias, "creator"), new LongValue(userId));
case "system_post":
// 处理权限逻辑根据业务需求进行更改
// dept 基于部门的数据权限
rule.addDeptColumn(AdminUserDO.class); // WHERE dept_id = ?
return new EqualsTo(MyBatisUtils.buildColumn(tableName, tableAlias, "updater"), new LongValue(userId));
default: return null;
}
}
}
第二种方式:每个 Maven Module, 通过自定义 DeptDataPermissionRuleCustomizer (opens new window) Bean,配置哪些表的哪些字段,进行数据权限的过滤。
@Configuration(proxyBeanMethods = false)
public class DataPermissionConfiguration {
@Bean
public DeptDataPermissionRuleCustomizer sysDeptDataPermissionRuleCustomizer() {
// 第一种业务逻辑权限控制选择:
return rule -> {
// dept 基于部门的数据权限
rule.addDeptColumn(AdminUserDO.class); // WHERE dept_id = ?
rule.addDeptColumn(DeptDO.class, "id"); // WHERE id = ?
// user 基于用户的数据权限
rule.addUserColumn(AdminUserDO.class, "id"); // WHERE id = ?
// rule.addUserColumn(OrderDO.class); // WHERE user_id = ?
};
// 第二种业务逻辑控制选择(需要根据具体业务需求进行修改逻辑代码):
return rule -> {
String tableName = "";
switch (tableName){
case "dept_id":
// dept 基于部门的数据权限
rule.addDeptColumn(AdminUserDO.class); // WHERE dept_id = ?
break;
case "user_id":
// rule.addDeptColumn(DeptDO.class, "id"); // WHERE id = ?
// user 基于用户的数据权限
rule.addUserColumn(AdminUserDO.class, "id"); // WHERE id = ?
break;
}
};
}
}
@DataPermission 注解
@DataPermission (opens new window) 数据权限注解,可声明在类或者方法上,配置使用的数据权限规则。
① enable 属性:当前类或方法是否开启数据权限,默认是 true 开启状态,可设置 false 禁用状态。
@GetMapping(“/get”)
@ApiOperation(“获得登录用户信息”)
@DataPermission(enable = false) // 关闭数据权限,避免只查看自己时,查询不到部门。
public CommonResult profile() {
// … 省略代码
if (user.getDeptId() != null) {
DeptDO dept = deptService.getDept(user.getDeptId());
resp.setDept(UserConvert.INSTANCE.convert02(dept));
}
// … 省略代码
}
② includeRules 属性,配置生效的 DataPermissionRule (opens new window) 数据权限规则。例如说,项目里有 10 种 DataPermissionRule 规则,某个方法只想其中的 1 种生效,则可以使用该属性。
③ excludeRules 属性,配置排除的 DataPermissionRule (opens new window) 数据权限规则。例如说,项目里有 10 种 DataPermissionRule 规则,某个方法不想其中的 1 种生效,则可以使用该属性。