设计思想:
【数据权限】是在【功能权限】的基础上面进一步的扩展,好比能够查看订单属于【功能权限】的范围,可是能够查看哪些订单就是【数据权限】的工做了。
根据不一样的角色定义一些规则,将规则值保存起来。最终将值 转化成执行脚本里面的值。
Mybatis拦截器的一个做用就是能够拦截某些方法的调用,能够选择在这些被拦截的方法执行先后加上某些逻辑,也能够在执行这些被拦截的方法时执行本身的逻辑而再也不执行被拦截的方法。
Mybatis拦截器设计的一个初衷就是为了供用户在某些时候能够实现本身的逻辑而没必要去动Mybatis固有的逻辑。
本方案中便可根据当前用户的数据范围动态的组装成sql做为全部查询sql的附加逻辑。
实现:
1,首先找到拦截时机
2,根据拦截器的注解声明,拦截的是Executor对象query方法
3,根据mabatis源码,取出在mappedStatement的SQL语句
4,取出sql语句,根据当前用户,获取规则,将条件追加到sql中
5,将加强后的sql再放回mappedStatement中spring
拦截器,加入一些权限处理,最后附加到SQL中sql
取到当前登录人信息app
这里取登录人信息,用了两种方式:
一种用 threadlocal, 同一个线程把变量传过来
另外一种直接在dao层用参数传过来,偷懒了,没有实现线程以前变量传递,当时状况是用户提交一个查询请求,导出直接提交给另外一个线程 springbatch去处理,因此就把登录了人的信息直接传到dao参数上了spa