转:http://www.iteedu.com/arch/auth/dataauth.htm
针对不同用户,在数据查询时要在SQL上拼上可以访问的部门机构部分。
这部分数据查询权限一般都是按一定配制或规则制定的。
这里看到一种比较好的方法可以实现数据权限。
使用方法
其中tableAlias为SQL中表的别名。
@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片段。
@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();
}
}