受疫情影响,还没开始上班,在家宅了那久,也该学习点东西了。今天来说说Aop,Aop 技术可以用来实现很多东西,最常见的就是做日志记录和缓存等。那么今天我来介绍一下怎么用Aop实现权限校验。
实现思路: 自定义注解,用Aop拦截自定注解在Aop中实现权限校验,话不多说,开始三部曲。
第一步: 新建一个springboot项目(需要web依赖),运行一下看项目是否可以正常运行,正常就可有进入下步了。
第二步:引入springAop依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
第三步:新建一个包xx.xx.annotation,用来放自定义注解,这里我就取名HasPermission吧,这里注解可以传多个值因此用数组。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface HasPermission {
String[] value();
}
第四部:完成Aop的编写(核心)
@Aspect
@Component
public class PermissionAspect {
//定义权限列表(实际应用中可以从数据库/缓存或session中获取)这里只是模拟
private List<String> permissions = Arrays.asList("add","delete","update","list");
//这里使用环绕通知切入自定义的注解即可
@Around("@annotation(com.zzj.demo.annotation.HasPermission)")
public Object point(ProceedingJoinPoint point){
try {
//1 获取当前执行的方法信息
MethodSignature methodSignature = (MethodSignature) point.getSignature();
Method method = methodSignature.getMethod();
//2 获取方法上的注解,如果有权限注解就验证
HasPermission annotation = method.getAnnotation(HasPermission.class);
if(annotation!=null){
String[] values = annotation.value();
boolean has = permissions.containsAll(Arrays.asList(values));
//有权限正常执行
if(has){
return point.proceed();
}
//3 没有权限设置响应状态为403
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletResponse response = attributes.getResponse();
response.setStatus(HttpStatus.FORBIDDEN.value());
}
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return null;
}
}
第五步:测试,编写控制器
@RestController
public class HomeController {
@GetMapping
public String index(){
return "首页";
}
@HasPermission("add")
@GetMapping("/add")
public String add(){
return "add";
}
@GetMapping("/delete")
@HasPermission("delete")
public String delete(){
return "delete";
}
@GetMapping("/update")
@HasPermission("update")
public String update(){
return "update";
}
@GetMapping("/list")
@HasPermission("list")
public String list(){
return "列表";
}
}
修改Aop中的权限列表只保留一个add权限测试一下,非add则或出现403,ok,这样就实现了权限拦截了。
总结: 关于springAop实现权限校验就介绍完了,是不是很简单,其实这个没有多少干货,思路而已(自己的个人想法)。喜欢我的文章记得关注我哦😊!
最后,Demo源码地址: https://gitee.com/zzj1992/Spring-Aop-Permission.git
网友评论