首页 > 编程知识 正文

aop实现权限拦截,aop实现权限控制

时间:2023-05-05 04:30:13 阅读:233335 作者:4427

转: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@Componentpublic 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(); }}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。