【权限】如何用AOP实现数据权限功能

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

}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值