记使用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的接口权限校验的更多相关文章

  1. redis分布式锁-spring boot aop+自定义注解实现分布式锁

    接这这一篇redis分布式锁-java实现末尾,实现aop+自定义注解 实现分布式锁 1.为什么需要 声明式的分布式锁 编程式分布式锁每次实现都要单独实现,但业务量大功能复杂时,使用编程式分布式锁无疑 ...

  2. 利用Spring AOP自定义注解解决日志和签名校验

    转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ...

  3. spring AOP自定义注解方式实现日志管理

    今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...

  4. spring AOP自定义注解 实现日志管理

    今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...

  5. (转)利用Spring AOP自定义注解解决日志和签名校验

    一.需解决的问题 部分API有签名参数(signature),Passport首先对签名进行校验,校验通过才会执行实现方法. 第一种实现方式(Origin):在需要签名校验的接口里写校验的代码,例如: ...

  6. SpringBoot系列(十三)统一日志处理,logback+slf4j AOP+自定义注解,走起!

    往期精彩推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件详解 SpringBoot系列(四)we ...

  7. AOP自定义注解鉴权

    刚出来工作那会或者在学校的时候,经常听到说AOP(面向对象编程,熟称切面)的用途是日志.鉴权等.但是那会不会,后面学会了,又没有写博客记录,今天写给大伙,希望能帮到大家 一.学习目标:利用AOP+自定 ...

  8. ssm+redis整合(通过aop自定义注解方式)

    此方案借助aop自定义注解来创建redis缓存机制. 1.创建自定义注解类 package com.tp.soft.common.util; import java.lang.annotation.E ...

  9. spring mvc注解和spring boot注解

    1 spring mvc和spring boot之间的关系 spring boot包含spring mvc.所以,spring mvc的注解在spring boot总都是可以用的吗? spring b ...

随机推荐

  1. Commons-Beanutils利用链分析

    前言 本篇开始介绍 commons-beanutils 利用链,注意Commons-Beanutils 不是Commons-Collections 不要看混了,首先来看一下,什么是 commons-b ...

  2. 墙裂推荐!2020Android阿里&腾讯&百度&字节&美团校招面试汇总

    基本情况 2021届硕士生,Android开发岗 此文主要是2020年年初春招实习的面试和正式校招面试经验汇总,最终校招拿到了腾讯,百度,美团等offer 主要包括阿里4面,腾讯实习4面和校招4面,字 ...

  3. Quartz 实现同一辅助类 重复开启多任务

    前言: 最近做一个项目,需要用到定时任务,第一就想到了Quartz,然后很开心的就实现了功能,但是后来发现一个问题,如果需要开启多个定时任务,需要写多个辅助类,而辅助类里面的功能基本差不多,这是我就想 ...

  4. Python语言系列-04-高阶函数

    闭包 #!/usr/bin/env python3 # author:Alnk(李成果) # 什么是闭包 # 1,闭包存在于函数中 # 2,闭包就是内层函数对外层函数(非全局变量)的引用 # 3,最内 ...

  5. springboot2集成log4j2

    pom <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:// ...

  6. 002 PCI Express体系结构(二)

    一.PCI总线的信号定义 PCI总线是一条共享总线,在一条PCI总线上可以挂接多个PCI设备.这些PCI设备通过一系列信号与PCI总线相连,这些信号由地址/数据信号.控制信号.仲裁信号.中断信号等多种 ...

  7. noip21

    所以分差到底要不要取绝对值啊 T1 3分钟出暴力,十分钟码好,然后样例过不去... 好吧,我是sb,求中位数之前是要排序的. 直接冲暴力,50pts. \(w=3\) 的点,开个桶记录一下又有20pt ...

  8. Sadmin:打造私有Django公共库实现代码复用

    我们借助于Django开发了许多的内部管理系统,例如之前介绍过的Probius.Kerrigan.Proxy等等,这些系统看起来长的都一样,但实际实现的功能确是千差万别,这些不同的系统为什么会长的一样 ...

  9. 【spring】69道Spring面试题和答案

    原文地址:http://ifeve.com/spring-interview-questions-and-answers/ 目录 Spring 概述 依赖注入 Spring beans Spring注 ...

  10. WPF---数据绑定之ValidationRule数据校验(六)

    一.概述 我们知道,Binding好比架设在Source和Target之间的桥梁,数据可以借助这个桥梁进行流通.在数据流通的过程中,我们可以在Binding这座桥梁上设置关卡,对数据的有效性进行验证. ...