动态数据权限
基本介绍
需要控制不同的角色、组织人员有查看不同数据范围的权限,从而设计动态数据权限。
三种方式来实现数据权限
1.代码层配置@DataAuth 注解达到脱离数据库的全固定配置方式
java
@DataAuth(column = "org_id", type = DataScopeEnum.OWN_ORG_CHILDREN)
2.提供代码层配置@DataAuth 注解配置数据权限资源编码来达到依赖数据库的半自动配置方式
java
@DataAuth(code = "test")
3.提供 web 界面在线配置,达到数据权限自动、动态生效的目的,优先级最高;
注解说明
- 数据权限的核心注解为@DataAuth,我们来看一下他的构成
java
package com.kyny.cbb.core.datascope.annotation;
import com.kyny.cbb.core.datascope.constant.DataScopeConstant;
import com.kyny.cbb.core.datascope.enums.DataScopeEnum;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 数据权限定义
*
*/
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface DataAuth {
/**
* 资源编号
*/
String code() default "";
/**
* 数据权限对应字段
*/
String column() default DataScopeConstant.DEFAULT_COLUMN;
/**
* 数据权限规则
*/
DataScopeEnum type() default DataScopeEnum.ALL;
/**
* 可见字段
*/
String field() default "*";
/**
* 数据权限规则值域
*/
String value() default "";
}
- 纯注解我们只需要关注下面三个字段即可,当中的数据权限规则枚举类我们来看下构成
java
package com.kyny.cbb.core.datascope.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 数据权限类型
*
*/
@Getter
@AllArgsConstructor
public enum DataScopeEnum {
/**
* 全部数据
*/
ALL(1, "全部"),
/**
* 本人可见
*/
OWN(2, "本人可见"),
/**
* 所在机构可见
*/
OWN_ORG(3, "所在组织可见"),
/**
* 所在机构及子级可见
*/
OWN_ORG_CHILDREN(4, "所在组织及子级可见"),
/**
* 自定义
*/
CUSTOM(5, "自定义");
/**
* 类型
*/
private final int type;
/**
* 描述
*/
private final String description;
public static DataScopeEnum of(Integer dataScopeType) {
if (dataScopeType == null) {
return null;
}
DataScopeEnum[] values = DataScopeEnum.values();
for (DataScopeEnum scopeTypeEnum : values) {
if (scopeTypeEnum.type == dataScopeType) {
return scopeTypeEnum;
}
}
return null;
}
}
- 可以看到,目前的数据权限类型一共有五种,前面四种都是不需要自定义写 sql 的,只有选择了 CUSTOM 类型,才需要定义注解的 value 属性
- 注解默认过滤的字段名为 org_id,如果有修改,则需要定义对应的字段名