目标明确,解决方法也就很明确了:注解
自定义注解如下:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface DataAuth {
String empId();
String project();
String org() default "";
String orderBy();
}
这个注解很好理解,作用域是方法级别,就是要查那个员工的,那个部门的,那个项目的,最后再排序下。
OK有了注解,就需要在拦截器里面进行捕获该注解:
/**
* 获取数据权限注解信息
*
* @param mappedStatement
* @return
*/
private DataAuth getPermissionByDelegate(MappedStatement mappedStatement) {
DataAuth dataAuth = null;
try {
String id = mappedStatement.getId();
//统计SQL取得注解也是实际查询id上得注解,所以需要去掉_COUNT
if(id.contains(COUNT_PRE)){
id = id.replace(COUNT_PRE,"");
}
String className = id.substring(0, id.lastIndexOf("."));
String methodName = id.substring(id.lastIndexOf(".") + 1, id.length());
final Class<?> cls = Class.forName(className);
final Method[] method = cls.getMethods();
for (Method me : method) {
if (me.getName().equals(methodName) && me.isAnnotationPresent(DataAuth.class)) {
dataAuth = me.getAnnotation(DataAuth.class);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return dataAuth;
}
这个就是反射了,没什么很难理解的,唯一需要注意的细节就是,如果是使用PageHelper的话,会默认先生存一个查询总数的SQL。这里需要共用改注解,而PageHelper的生成查询总量的方法其实就在该查询ID的后面追加_count
private static final String COUNT_PRE = "_COUNT";
所以这里捕获注解的时候需要去原查询的Id上去捕获,保证统计方法也能拼接上权限SQL。