mybatis拦截器实现权限管理( 二 )

collect = new ArrayList<>(16);for (Integer userId : localDataAuthority.getOperators()) {collect.add(new StringValue("" + userId + ""));}ExpressionList operatorList = new ExpressionList(collect);expression = new InExpression(new Column(operatorAlias), operatorList);}}if (localDataAuthority.isHasGame() && localDataAuthority.getAllGame() != 1) {Expression gameCodeExpression;if (CollectionUtils.isEmpty(localDataAuthority.getGames())) {gameCodeExpression = NO_Match;} else {List collect = new ArrayList<>(16);for (String gameCode : localDataAuthority.getGames()) {collect.add(new StringValue("" + gameCode + ""));}ExpressionList gameCodeList = new ExpressionList(collect);gameCodeExpression = new InExpression(new Column(gameAlias), gameCodeList);}expression = new AndExpression(expression, gameCodeExpression);}if (localDataAuthority.isHasMedia() && localDataAuthority.getAllMedia() != 1) {Expression mediaCodeExpression;if (CollectionUtils.isEmpty(localDataAuthority.getMediaCodes())) {mediaCodeExpression = NO_Match;} else {List collect = new ArrayList<>(16);for (String mediaCode : localDataAuthority.getMediaCodes()) {collect.add(new StringValue("" + mediaCode + ""));}ExpressionList mediaCodeList = new ExpressionList(collect);mediaCodeExpression = new InExpression(new Column(mediaAlias), mediaCodeList);}expression = new AndExpression(expression, mediaCodeExpression);}//代理人处理if (!CollectionUtils.isEmpty(localDataAuthority.getAgentIds())) {List collect = new ArrayList<>(16);for (Integer agentId : localDataAuthority.getAgentIds()) {collect.add(new StringValue("" + agentId + ""));}ExpressionList agentIds = new ExpressionList(collect);InExpression inExpression = new InExpression(new Column("id"), agentIds);expression = new OrExpression(expression, inExpression);}CustomMultiExpression customMultiExpression = new CustomMultiExpression(Arrays.asList(expression));if (plainSelect.getWhere() != null) {plainSelect.setWhere(new AndExpression(plainSelect.getWhere(), customMultiExpression));} else {plainSelect.setWhere(customMultiExpression);}Field additionalParametersField = BoundSql.class.getDeclaredField("additionalParameters");additionalParametersField.setAccessible(true);Map additionalParameters = (Map) additionalParametersField.get(boundSql);BoundSql pageBoundSql = new BoundSql(ms.getConfiguration(), plainSelect.toString(), boundSql.getParameterMappings(), parameter);//设置动态参数for (String key : additionalParameters.keySet()) {pageBoundSql.setAdditionalParameter(key, additionalParameters.get(key));}return executor.query(ms, parameter, rowBounds, resultHandler, cacheKey, pageBoundSql);} else {return executor.query(ms, parameter, rowBounds, resultHandler, cacheKey, boundSql);}} finally {DataPermissionHelper.clearDataPermission();}}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {}}
由上代码可以看到 , 我们定义了一个拦截器 , 把将要执行的sql语句进行拦截 , 通过线程上下文拿到此前封装好的数据形式 , 在由解析器将一段完整的Sql解析成方便拼装的Sql表达式 , 最后将此sql输出由执行器执行 , 达到控制的效果 。
public class DataPermissionHelper {private static ThreadLocal localDataPermission = new ThreadLocal<>();/*** 获取 Page 参数** @return*/public static MybatisDataAuthority getLocalDataAuthority() {return localDataPermission.get();}public static void clearDataPermission() {localDataPermission.remove();}public static void startDataPermissionHasAgent(Integer permissionId, Boolean hasGame, Boolean hasMedia, String operatorAlias, String gameAlias, String mediaAlias, String userDataTable) {// 获取当前的用户LoginUser loginUser = SecurityUtils.getLoginUser();List userIds = new ArrayList<>(16);boolean allOperator = false;if (loginUser != null) {// 查询本人的当前页面的操作权限for (PermissionV2Vo permissionV2Vo : loginUser.getPermissionV2VoList()) {if (permissionV2Vo.getId().equals(permissionId)) {switch (permissionV2Vo.getDataAuthority()) {// 本人case 1:userIds.add(loginUser.getUserId());break;// 本部门case 2:// 获取部门的人员Example example = new Example(UserV2.class);example.createCriteria().andEqualTo("departmentId", loginUser.getUser().getDepartmentId());userIds = SpringUtil.getBeanByType(UserV2Mapper.class).selectByExample(example).stream().map(BaseEntity::getId).collect(Collectors.toList());break;// 公司case 3:allOperator = true;default:break;}}}}// 获取代理人UserDataPermissionMapper userDataPermissionMapper = SpringUtil.getBeanByType(UserDataPermissionMapper.class);Example example = new Example(UserDataPermission.class);example.createCriteria().andEqualTo("status", 1).andEqualTo("tableName", userDataTable).andEqualTo("userId", loginUser.getUserId());List