当前位置: 首页 > article >正文

guava 整合springboot 自定义注解实现接口鉴权调用保护

文章目录

  • 一、简要概述
  • 二、实现过程
    • 1. pom引入依赖
    • 2. 自定义注解
    • 3. 定义切面
    • 4. 定义权限检查逻辑
  • 三、注解使用
  • 四、运行结果
  • 五、源码放送

一、简要概述

Guava Cache是一个全内存的本地缓存实现,它提供了线程安全的实现机制。我们借助expireAfterWrite过期时间设置和springboot的自定义注解、切面等技术来打造最简单的接口鉴权系统。

二、实现过程

1. pom引入依赖

在原有springboot基础上引入切面、guava依赖

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-aop</artifactId>
		</dependency>
		<dependency>
			<groupId>com.google.guava</groupId>
			<artifactId>guava</artifactId>
			<version>32.1.2-jre</version>
		</dependency>

2. 自定义注解


import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AuthToken
{
    
}

3. 定义切面

在aop的逻辑内,先走@Around注解的方法。然后是@Before注解的方法,然后这两个都通过了,走核心代码,核心代码走完,无论核心有没有返回值,都会走@After方法。然后如果程序无异常,正常返回就走@AfterReturn,有异常就走@AfterThrowing。

在这里插入图片描述
在这里插入图片描述

我们这里使用了 @Before:前置通知,在调用目标方法之前执行检查


import javax.servlet.http.HttpServletRequest;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import com.fly.core.exception.ValidateException;
import com.fly.core.utils.HttpServletUtils;
import com.fly.demo.aspect.annotation.AuthToken;
import com.fly.demo.service.TokenService;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Aspect
@Order(0)
@Component
public class AuthTokenAspect
{
    @Autowired
    TokenService tokenService;
    
    /**
     * 使用AuthToken注解标注的类
     * 
     */
    @Before("@annotation(authToken)")
    public void doBefore(JoinPoint joinPoint, AuthToken authToken)
    {
        HttpServletRequest request = HttpServletUtils.getRequest();
        if (request == null)
        {
            log.error("AuthToken注解使用错误,当前请求非web请求");
        }
        log.info("开始执行鉴权检查");
        String token = request.getHeader("token");
        if (!tokenService.valide(token))
        {
            throw new ValidateException("对不起,您无权访问该接口,请检查token参数");
        }
    }
}

4. 定义权限检查逻辑


import java.util.UUID;
import java.util.concurrent.TimeUnit;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class TokenService
{
    /**
     * 30分钟失效
     */
    Cache<String, String> cache = CacheBuilder.newBuilder().expireAfterWrite(30, TimeUnit.MINUTES).build();
    
    /**
     * 验证token是否合法
     * 
     * @param token
     */
    public boolean valide(String token)
    {
        return StringUtils.equals(token, getToken());
    }
    
    /**
     * 获取sysToken
     */
    private String getToken()
    {
        String sysToken = cache.getIfPresent("token");
        if (sysToken == null)
        {
            sysToken = UUID.randomUUID().toString().replace("-", "");
            log.info("------ now valid sysToken is: {}", sysToken);
            cache.put("token", sysToken);
        }
        return sysToken;
    }
}

三、注解使用

我们在需要执行权限检查的地方添加@AuthToken即可

    @AuthToken
    @ApiOperation("刷新欢迎语")
    @PostMapping("/refresh")
    @ApiImplicitParam(name = "message", value = "欢迎语", allowableValues = "骝马新跨白玉鞍,战罢沙场月色寒。城头铁鼓声犹震,匣里金刀血未干。,活捉洪真英,生擒李知恩! ", required = true)
    public JsonResult<?> refresh(@RequestHeader String token, String message)
    {
        if (StringUtils.isBlank(message))
        {
            return JsonResult.error("message不能为空");
        }
        boolean success = updateWelcomeMsg(message) > 0;
        return success ? JsonResult.success(message) : JsonResult.error("刷新欢迎语失败");
    }

四、运行结果

token不合法提示
在这里插入图片描述
后台查看token
在这里插入图片描述
请求头填入合法token
在这里插入图片描述
接口调用成功
在这里插入图片描述

五、源码放送

https://gitcode.com/00fly/springboot-demo/overview


有任何问题和建议,都可以向我提问讨论,大家一起进步,谢谢!

-over-


http://www.kler.cn/a/429284.html

相关文章:

  • 警惕IDEA 2024版重大Bug问题:LomBok失效、Gradle冲突、Spring Boot启动错误
  • 复用类(4):final关键字、初始化与类的加载
  • 关于vite+vue3+ts项目中env.d.ts 文件详解
  • SpringSecurity-前后端分离
  • Redis延迟队列详解
  • SparkSQL数据模型综合实践
  • 题海拾贝:力扣 231. 2 的幂
  • 使用Python和OpenGL实现3D立方体的交互式显示
  • 康托展开和逆康托展开
  • java-数组—acwing
  • 【C语言】数据库事物的ACID属性
  • 在Ubuntu上使用IntelliJ IDEA:开启你的Java开发之旅!
  • osi七层模型
  • 电子商务人工智能指南 6/6 - 人工智能生成的产品图像
  • Linux DNS之进阶篇bind-chroot企业级部署方式
  • Electron小案例
  • 超详细搭建PhpStorm+PhpStudy开发环境
  • git提交时出现merge branch main of xxx
  • Win11 配置 TeXstudio 编辑器教程
  • C# Winform飞机大战小游戏源码
  • docker的网络类型和使用方式
  • 【计算机图形学】实验2:橡皮筋技术及拾取操作
  • 运维排错系列:Excel上传失败,在剪切板有大量信息。是否保存其内容...
  • 基于yolov10的反光衣和安全帽检测系统,支持图像检测,视频检测和实时摄像检测功能(pytorch框架,python源码)
  • ensp实验-vrrp多网关配置
  • 【Android】结构型设计模式—代理模式、装饰模式、外观模式、享元模式