自定义地区参数处理切面
省级账号:
- 如果没有传参或者传参是省级,那就地区参数置NULL。
- 如果传参是市级就进行截断。
- 如果是区(县)级不处理。
市级账号:
- 如果没有传参,将地区设置为当前用户所属区域。
- 如果传参和所属地区不一致,若传参>权限,地区设置为用户所属地区。
- 如果传参和所属地区不一致,若传参<权限,判断参数级别,如果是市级就进行截断,如果是区(县)级不处理。
县(区)账号:
- 参数直接改为用户区域
自定义接口注解
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);
}