ruoyi-vue-pro框架通过permission组件自定义权限规则(策略)

第一种方式:自定义数据权限规则
步骤一:权限控制接口

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 种生效,则可以使用该属性。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值