使用AOP+自定义注解完成spring boot的接口权限校验
记使用AOP+自定义注解完成接口的权限校验,代码如下:
pom文件添加所需依赖:
1 <dependency>
2 <groupId>org.aspectj</groupId>
3 <artifactId>aspectjrt</artifactId>
4 <version>1.8.9</version>
5 </dependency>
6 <dependency>
7 <groupId>org.springframework.boot</groupId>
8 <artifactId>spring-boot-starter-aop</artifactId>
9 </dependency>
先自定义注解@MyAnnotation,注解中可以设置所需参数:
1 package com.itcq.aop;
2
3 import java.lang.annotation.*;
4
5 //定义注解可以使用的范围
6 @Target({ElementType.TYPE, ElementType.METHOD})
7 @Retention(RetentionPolicy.RUNTIME)
8 @Documented
9 public @interface MyAnnotation {
10
11 String name();
12 }
定义解析注解的MyAnnotationService,完成接口权限校验的逻辑,这里我是获取接口请求时header中的user_name参数,进行校验:
1 package com.itcq.aop;
2
3 import lombok.extern.slf4j.Slf4j;
4 import org.aspectj.lang.ProceedingJoinPoint;
5 import org.aspectj.lang.Signature;
6 import org.aspectj.lang.annotation.Around;
7 import org.aspectj.lang.annotation.Aspect;
8 import org.aspectj.lang.annotation.Pointcut;
9 import org.springframework.stereotype.Component;
10 import org.springframework.web.context.request.RequestContextHolder;
11 import org.springframework.web.context.request.ServletRequestAttributes;
12
13 import javax.servlet.http.HttpServletRequest;
14
15 @Aspect
16 @Component
17 @Slf4j
18 public class MyAnnotationService {
19
20 //切入点表达式决定了用注解方式的方法切还是针对某个路径下的所有类和方法进行切,方法必须是返回void类型
21 @Pointcut("@annotation(com.itcq.aop.MyAnnotation)")
22 private void roleCheckCut() {};
23
24 //定义了切面的处理逻辑。即方法上加了@MyAnnotation注解,将会进行权限校验
25 @Around("roleCheckCut()")
26 public Object operateAuth(ProceedingJoinPoint pjp) throws Throwable {
27
28 //打印日志
29 Signature signature = pjp.getSignature();
30 String className = pjp.getTarget().getClass().getSimpleName();
31 String methodName = signature.getName();
32 log.info("className:{},methodName:{}", className, methodName);
33
34 //获取接口请求时header中的user_name参数,进行校验
35 HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
36 String userName = request.getHeader("user_name");
37 //这里可以Apollo配置可以放行的角色
38 if (!"hwy".equals(userName)) {
39 throw new Exception(userName+"权限校验不通过");
40 }
41 return pjp.proceed();
42 }
43 }
最后在controller层中编写测试方法,利用postman测试接口:
1 package com.itcq.controller;
2
3 import com.itcq.aop.MyAnnotation;
4 import com.itcq.service.TestService;
5 import org.springframework.beans.factory.annotation.Autowired;
6 import org.springframework.web.bind.annotation.GetMapping;
7 import org.springframework.web.bind.annotation.RequestHeader;
8 import org.springframework.web.bind.annotation.RequestParam;
9 import org.springframework.web.bind.annotation.RestController;
10
11 @RestController
12 public class TestController {
13
14 @Autowired
15 private TestService testService;
16
17 @GetMapping("/test")
18 @MyAnnotation(name = "HWY")
19 public String testMethod(@RequestHeader(name = "user_name") String userName,
20 @RequestParam(name = "user_age") Integer userAge) {
21
22 return testService.testMethod(userName, userAge);
23 }
24 }
两种不同请求参数的测试结果如下:
参数正确时的返回结果:

参数不正确时的返回结果,接口报错,控制台输出:


可以发现使用AOP+自定义注解的形式完成了接口的权限校验,当然这只算是比较初级的应用,AOP+自定义注解还有很大的探索空间。
使用AOP+自定义注解完成spring boot的接口权限校验的更多相关文章
- redis分布式锁-spring boot aop+自定义注解实现分布式锁
接这这一篇redis分布式锁-java实现末尾,实现aop+自定义注解 实现分布式锁 1.为什么需要 声明式的分布式锁 编程式分布式锁每次实现都要单独实现,但业务量大功能复杂时,使用编程式分布式锁无疑 ...
- 利用Spring AOP自定义注解解决日志和签名校验
转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ...
- spring AOP自定义注解方式实现日志管理
今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...
- spring AOP自定义注解 实现日志管理
今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...
- (转)利用Spring AOP自定义注解解决日志和签名校验
一.需解决的问题 部分API有签名参数(signature),Passport首先对签名进行校验,校验通过才会执行实现方法. 第一种实现方式(Origin):在需要签名校验的接口里写校验的代码,例如: ...
- SpringBoot系列(十三)统一日志处理,logback+slf4j AOP+自定义注解,走起!
往期精彩推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件详解 SpringBoot系列(四)we ...
- AOP自定义注解鉴权
刚出来工作那会或者在学校的时候,经常听到说AOP(面向对象编程,熟称切面)的用途是日志.鉴权等.但是那会不会,后面学会了,又没有写博客记录,今天写给大伙,希望能帮到大家 一.学习目标:利用AOP+自定 ...
- ssm+redis整合(通过aop自定义注解方式)
此方案借助aop自定义注解来创建redis缓存机制. 1.创建自定义注解类 package com.tp.soft.common.util; import java.lang.annotation.E ...
- spring mvc注解和spring boot注解
1 spring mvc和spring boot之间的关系 spring boot包含spring mvc.所以,spring mvc的注解在spring boot总都是可以用的吗? spring b ...
随机推荐
- 使用jwt来保护你的接口服务
以前写过一篇关于接口服务规范的文章,原文在此,里面关于安全性问题重点讲述了通过appid,appkey,timestamp,nonce以及sign来获取token,使用token来保障接口服务的安全. ...
- user-agent随笔
常用的user-agent: 一.pc端的user-agent汇总,各大浏览器 1.safari 5.1 – MAC Mozilla/5.0 (Macintosh; U; Intel Mac OS X ...
- Java基础——类型转换注意事项及常见问题
类型转换 由于Java是强类型语言,所以要进行有些运算的时候,需要用类型转换 低------------------------------------------------------------ ...
- Bugku-web-秋名山老司机
计算式子的值然后使用post方法传值.直接脚本跑. import requestsimport reurl = "http://123.206.87.240:8002/qiumingshan ...
- 记一次 .NET 某WMS仓储打单系统 内存暴涨分析
一:背景 1. 讲故事 七月中旬有一位朋友加wx求助,他的程序在生产上跑着跑着内存就飙起来了,貌似没有回头的趋势,询问如何解决,截图如下: 和这位朋友聊下来,感觉像是自己在小县城当了个小老板,规律的生 ...
- git的实用命令(撤回,合并)
前言 在用开发项目的时候,经常会写着写着会发现写错的时候,人生没有后悔药,但是git有啊,大不了从头再来嘛. git的一些撤销操作 代码还没有存到暂存区 当我们修改了一个文件,还没有执行git add ...
- rollup 开发环境搭建
rollup 开发环境搭建 初始化项目使用lerna管理项目 使用npm init 初始化项目 npm init -y 安装lerna并初始化项目 npm install lerna --save-d ...
- 跟我一起写 Makefile(三)
Makefile 总述 ------- 一.Makefile里有什么? Makefile里主要包含了五个东西:显式规则.隐晦规则.变量定义.文件指示和注释. 1.显式规则.显式规则说明了,如何生成一个 ...
- 【笔记】Bagging和Pasting以及oob(Out-of-Bag)
Bagging和Pasting以及oob(Out-of-Bag) Bagging和Pasting 前面讲到soft voting classifier和hard voting classifier两个 ...
- Python - typing 模块 —— Callable
前言 typing 是在 python 3.5 才有的模块 前置学习 Python 类型提示:https://www.cnblogs.com/poloyy/p/15145380.html 常用类型提示 ...