在最近的一段时间遇到过很多面向切面的编程(AOP)。
也查找过许多资料,都没有符合目前的需求,也是今天突然的灵光一现想到的解决方案
个人需求:
现在项目已经接近尾声,但是用户的权限没有做,主要的任务是做一套针对于每个用户的权限,实现每个用户只能查看自己权限下的数据。
ps:由于前期做的不太完善,要给用户新增加省市区的权限
首次思路:
是通过登录后把权限写入到token中,在调取接口时解析效验token是取出存入到全局静态方法中。已实现。
本次思路:
通过AOP面向切面实现注解解析授权:已实现
注解层:
package com.nengyy.dem_rest_server.aspect;
import java.lang.annotation.*;
@Target(ElementType.METHOD) // METHOD 是获取接口入参的一个类型
@Retention(RetentionPolicy.RUNTIME) // 接口调用的时间
@Documented
public @interface CheckRole { // 检查权限的注解
}
注解获取入参具体实现:
package com.nengyy.dem_rest_server.aspect;
import com.nengyy.dem_auth.security.Auth; // 个人的写的全局静态调用方法
import com.nengyy.dem_auth.security.UserInfo; // 用户的信息
import com.nengyy.dem_dto.common.InBasePageDto; // 分页的公共类
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Slf4j
@Aspect
@Component
public class CheckRoleAspect {
@Pointcut("@annotation(com.nengyy.dem_rest_server.aspect.CheckRole)") // 注解路径
public void beForeCheckRole() {
}
@Before("beForeCheckRole()")
public void checkRole(JoinPoint point) {
Object[] args = point.getArgs(); // 获取入参
UserInfo userInfo = Auth.getUserInfo(); // 全局静态方法 获取用户信息
InBasePageDto arg = (InBasePageDto) args[0]; // 此处是把每个接口的入参继承的分页类强转
// 下面是要对入参进行的处理 贴合个人的实际情况处理
// CityUtils.checkRole(arg.getAreaIdList(),userInfo.getCountyId());
// CityUtils.checkRole(arg.getCityIdList(),userInfo.getCityId());
// CityUtils.checkRole(arg.getSpaceIdList(),userInfo.getSpaceId());
}
}
分页类:
@Data
public class InBasePageDto {
// 市
private List<String> cityIdList;
// 区
private List<String> areaIdList;
// 区县下的站点
private List<String> spaceIdList;
//这样写入是对每个分页的接口进行单独的处理 入参市,区,站点,字段必须一致
protected Integer pageSize = 10;
protected Integer pageNo = 1;
protected Integer cnt;
public Integer getDatabasePageNo(){
if(this.pageNo <= 0){
return 0;
}
return this.pageNo-1;
}
}
controller层:
@CheckRole
@PostMapping("/getCheckPointList")
PagedResources<OutCheckPointDto> getCheckPointList(@RequestBody InCheckPointDto inCheckPointDto) throws Exception {
if(ListUtils.isNotNull(inCheckPointDto.getAreaIdList()) && ListUtils.isNotNull(inCheckPointDto.getCityIdList()) && ListUtils.isNotNull(inCheckPointDto.getSpaceId())){
Page<OutCheckPointDto> data = alarmService.getCheckPointList(inCheckPointDto);
return new PagedResources<>(data);
}else {
return new PagedResources<>(new Page<>());
}
}