这篇文章主要是用于总结并记录一下项目中数据权限的实现。
项目中是根据用户所属的组织,项目进行数据的过滤,项目是属于组织树的子级,所以项目中是用注解,对于需要进行数据权限控制的接口进行sql的拼接来实现数据过滤。
项目中先自定义一个注解
@Target(value = ElementType.METHOD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface DataPermission {
}
只要在接口上加上注解(对数据权限控制过滤到项目)
@DataPermission()
注解写完之后需要用到aop对注解前后进行一个处理来实现数据权限的设置
@Slf4j
@Aspect
@Component
public class DataPermissionAspect {
@Autowired
private RedisUtil redisUtil;
@Pointcut("@annotation(com.els.common.system.permission.annotation.DataPermission)")
public void pointCut() {
}
@Around("pointCut() && @annotation(dataPermission)")
public Object around(ProceedingJoinPoint point, DataPermission dataPermission) throws Throwable {
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest httpServletRequest = servletRequestAttributes.getRequest();
String token = httpServletRequest.getHeader("X-Access-Token");
//可根据token获取当前登录用户信息
String account = "xxx";
//用登录人的账号作为key,从redis中获取当前登录人的数据权限信息
String key = CommonConstant.SYS_DATA_PERMISSION + account;
DataPermissionDto dataPermissionDto = (DataPermissionDto) redisUtil.get(key);
// 如果redis查不到当前登录人的数据权限信息,则查询当前用户数据权限并设置到缓存中
if (dataPermissionDto == null) {
String elsAccount = "";
String subAccount = "";
//根据登录人账号,查询数据权限表,设置到DataPermissionDto对象中存到redis
xxx.setDataPermission(elsAccount, subAccount);
dataPermissionDto = (DataPermissionDto) redisUtil.get(key);
}
log.info("EVENT=设置当前用户的数据权限|dataPermissionDto={}", JSON.toJSONString(dataPermissionDto));
try {
return point.proceed();
} finally {
DataPermissionUtil.clear();
}
}
}
数据权限对象(DataPermissionDto):
@Data
public class DataPermissionDto implements Serializable {
private static final long serialVersionUID = 2338797575500858916L;
public final static Integer INNER_ACCOUNT = 0;
/**
* 区域编码列表
*/
private List<String> orgCodeList;
/**
* 项目编码列表
*/
private List<String> projectCodeList;
}
数据权限表里有用户信息字段和组织项目信息字段,可根据用户查询到用户的所有组织或项目信息。
以上就可以根据登录人获取设置好当前登录人的数据权限信息(DataPermissionDto对象)。
然后就可以根据登录人信息从redis里获取当前登录人的数据权限信息,对接口查询的sql加上过滤参数实现数据权限过滤。
以上就是数据权限的一些基本思路,实际项目中并不止这么简单。