【权限】如何用AOP实现数据权限功能

针对不同用户,在数据查询时要在SQL上拼上可以访问的部门机构部分。

这部分数据查询权限一般都是按一定配制或规则制定的。

这里看到一种比较好的方法可以实现数据权限。

使用方法

其中tableAlias为SQL中表的别名。

1
2
3
4
5
6
7
8
9
10
11
12
@DataAuth(tableAlias = "s")
public Result list(@RequestParam Map<String, Object> params){
//查询列表数据
Query query = new Query(params);

List<UserEntity> userList = userService.queryList(query);
int total = userService.queryTotal(query);

PageUtils pageUtil = new PageUtils(userList, total, query.getLimit(), query.getPage());

return Result.ok().put("page", pageUtil);
}

### 关键的AOP方法

核心思想就是查询参数是一个MAP,在MAP中加入dataAuthSql参数,dataAuthSql是通过用户配制信息生成的一个SQL片段。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
@Aspect
@Component
public class DataAuthAspect {
@Pointcut("@annotation(com.hxy.modules.common.annotation.DataAuth)")
public void dataAuthPointcut(){

}

@Before("dataAuthPointcut()")
public void dataAuth(JoinPoint joinPoint) throws Throwable{
//获取方面第一个参数
Object params = joinPoint.getArgs()[0];
//如果参数为Map类型
if(params != null && params instanceof Map){
String currentUserId = UserUtils.getCurrentUserId();
//如果当前用户不为超级管理员,则需要进行数据过滤
if(!currentUserId.equals(Constant.SUPERR_USER)){
((Map) params).put("dataAuthSql",dataAuthSql(joinPoint));
}
}else {
throw new MyException("需要数据权限过滤,需要查询方法的第一个参数为Map类型,且不能为NULL");
}
}

public String dataAuthSql(JoinPoint joinPoint){
//获取目标方法签名
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
//通过方法签名,获取数据过滤注解
DataAuth annotation = signature.getMethod().getAnnotation(DataAuth.class);
//通过注解获取别名
String tableAlias = annotation.tableAlias();
if(!StringUtils.isEmpty(tableAlias)){
tableAlias+=".";
}
StringBuilder dataAuthSql = new StringBuilder();
dataAuthSql.append(" AND (");

//获取用户授权部门
String baids = UserUtils.getDateAuth(Constant.DataAuth.BA_DATA.getValue());
//获取用户授权机构
String bapids = UserUtils.getDateAuth(Constant.DataAuth.BAP_DATA.getValue());
dataAuthSql.append(tableAlias);
dataAuthSql.append("create_id = ");
dataAuthSql.append("'" + UserUtils.getCurrentUserId() + "'");
if(baids != null && !StringUtils.isEmpty(baids)){
dataAuthSql.append("OR ");
dataAuthSql.append(tableAlias);
dataAuthSql.append("baid IN(");
dataAuthSql.append(baids);
dataAuthSql.append(")");
}
if(bapids != null && !StringUtils.isEmpty(bapids)){
dataAuthSql.append("OR ");
dataAuthSql.append(tableAlias);
dataAuthSql.append("bapid IN(");
dataAuthSql.append(bapids);
dataAuthSql.append(")");
}
dataAuthSql.append(")");
return dataAuthSql.toString();
}

}