【權限】如何用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();
}

}
体彩25选5走势图