自定义地区参数处理切面

省级账号:

  1. 如果没有传参或者传参是省级,那就地区参数置NULL。
  2. 如果传参是市级就进行截断。
  3. 如果是区(县)级不处理。

市级账号:

  1. 如果没有传参,将地区设置为当前用户所属区域。
  2. 如果传参和所属地区不一致,若传参>权限,地区设置为用户所属地区。
  3. 如果传参和所属地区不一致,若传参<权限,判断参数级别,如果是市级就进行截断,如果是区(县)级不处理。

县(区)账号:

  1. 参数直接改为用户区域

自定义接口注解

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface AreaPermissions {
    Class type();
    String fieldName();
    boolean isSubstring() default true;
}

切面方法

@Aspect
@Component
public class AreaPermissionsAspect {

    @Pointcut("@annotation(com.zs.backcontrolgov.annontation.AreaPermissions)||@within(com.zs.backcontrolgov.annontation.AreaPermissions)")
    public void areaPermissions(){}
    @Autowired
    private ISysAreaService iSysAreaService;

    @Around(value = "areaPermissions();")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
        LoginUser loginUser = SecurityUtils.getLoginUser();
        // 拦截的方法
        Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
        AreaPermissions annotation = method.getAnnotation(AreaPermissions.class);
        Class type = annotation.type();
        String fieldName = annotation.fieldName();
        Object arr = null;
        Object[] args = joinPoint.getArgs();
        for (Object arg : args) {
            if(arg.getClass().equals(type)){
                arr = arg;
            }
        }
        if(arr==null){
            throw new RuntimeException("AreaPermissionsAspect切面中AreaPermissions注解必须设置type属性");
        }
        Field declaredField = type.getDeclaredField(fieldName);
        declaredField.setAccessible(IS_ACCESSIBLE);
        //获取参数的区域信息
        String code = (String)declaredField.get(arr);
        QueryWrapper<SysArea> areaQueryWrapper = new QueryWrapper<>();
        areaQueryWrapper.eq("code", code);
        SysArea sysArea = iSysAreaService.getOne(areaQueryWrapper);
        //获取用户的区域信息
        String areaCode = loginUser.getAreaCode();
        QueryWrapper<SysArea> userAreaQueryWrapper = new QueryWrapper<>();
        userAreaQueryWrapper.eq("code", areaCode);
        SysArea userSysArea = iSysAreaService.getOne(userAreaQueryWrapper);
        if(!loginUser.getUser().isAdmin()&&(userSysArea==null||StringUtils.isEmpty(areaCode))){
            throw new RuntimeException("用户区域信息不全");
        }
        //如果是管理员或省级账号,则做简单处理即可
        if(loginUser.getUser().isAdmin()||"0".equals(userSysArea.getType())){
            if(sysArea==null){
                //如果没有传参
                return joinPoint.proceed();
            }
            if("0".equals(sysArea.getType())){
                //将参数制空
                declaredField.set(arr,null);
            }
            if("1".equals(sysArea.getType())){
                //如果是市级就截断
                if(annotation.isSubstring()) {
                    declaredField.set(arr,code.substring(0, 4));
                }
            }
            return joinPoint.proceed();
        }
        //如果是市级账号
        if("1".equals(userSysArea.getType())){
            if(sysArea==null||code.equals(areaCode)){
                //如果没有传参,将参数改为当前用户数据, 如果参数与用户区域编码不一致,需要判断权限大小
                if(annotation.isSubstring()) {
                    declaredField.set(arr,areaCode.substring(0, 4));
                }else {
                    declaredField.set(arr,areaCode);
                }
                return joinPoint.proceed();
            }else {
                //如果不一致
                //验证是否大于该区域,大于则置换为areacode
                String code4 = code.substring(0,4);
                String areaCode4 = areaCode.substring(0,4);
                if(!areaCode4.equals(code4)){
                    //如果权限不一致,则切换为用户区域编码
                    if(annotation.isSubstring()) {
                        declaredField.set(arr,areaCode.substring(0, 4));
                    }else {
                        declaredField.set(arr,areaCode);
                    }
                    return joinPoint.proceed();
                }else {
                    //判断参数是哪个哪个级别的区域
                    if("1".equals(sysArea.getType())){
                        //如果是市级就截断
                        if(annotation.isSubstring()) {
                            declaredField.set(arr,code.substring(0, 4));
                        }
                    }
                    return joinPoint.proceed();
                }
            }
        }
        //如果是区级
        if("2".equals(userSysArea.getType())) {
            //如果是区级,直接改为用户区域
            declaredField.set(arr,areaCode);
            return joinPoint.proceed();
        }
        return joinPoint.proceed();
    }


    private String getParameter(Map<String, String[]> params,String name) {
        String[] values = params.get(name);
        if (values == null || values.length == 0) {
            return null;
        }
        return values[0];
    }

    /**
     * 添加参数
     *
     * @param name
     * @param value
     */
    private void addParameter(Map<String, String[]> params,String name, Object value) throws NoSuchFieldException, IllegalAccessException {
        Field locked = params.getClass().getDeclaredField("locked");
        locked.setAccessible(IS_ACCESSIBLE);
        locked.setBoolean(params,false);
        if (value != null) {
            // System.out.println(value);
            if (value instanceof String[]) {
                params.put(name, (String[]) value);
            } else if (value instanceof String) {
                params.put(name, new String[]{(String) value});
            } else {
                params.put(name, new String[]{String.valueOf(value)});
            }
        }
        locked.setBoolean(params,true);
    }

}

接口使用

  /**
     * 查询企业信息列表
     *
     * @return
     */
    @GetMapping("/entListRating")
    @ApiOperation(value = "查询企业信息列表")
    @AreaPermissions(type =EntInfoDTO.class,fieldName = "code")
    public AjaxResult Rating(EntInfoDTO entInfoDTO) {
        PageUtils page = entBaseInfoService.selectEntListRating(entInfoDTO);
        return AjaxResult.success(page);
    }