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-

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/936117.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nginx 部署 ModSecurity3

一、查看本地nginx版本 nginx是yum安装的 # nginx -v nginx version: nginx/1.26.2 二、安装依赖工具 # yum install -y gcc-c flex bison yajl lmdb lua curl-devel curl GeoIP-devel zlib-devel pcre-devel pcre2-devel libxml2-devel ssdeep-devel libtool autoconf aut…

threejs——无人机概念切割效果

主要技术采用着色器的切割渲染,和之前写的风车可视化的文章不同,这次的切割效果是在着色器的基础上实现的,并新增了很多可调节的变量,兄弟们,走曲儿~ 线上演示地址,点击体验 源码下载地址,点击下载 正文 从图中大概可以看出以下信息,一个由线组成的无人机模型,一个由…

【LeetCode】每日一题 2024_12_13 K 次乘运算后的最终数组 I(暴力)

前言 每天和你一起刷 LeetCode 每日一题~ 小聊两句 1、今天是 12.13 南京大屠杀国家公祭日。铭记历史&#xff0c;勿忘国耻。 2、今天早上去看了 TGA 年度游戏颁奖&#xff0c;小机器人拿下了年度最佳游戏&#xff0c;所有人都震惊了&#xff0c;大伙纷纷问到&#xff0c;谁…

向达梦告警日志说声hello

为了调试和跟踪一些业务功能&#xff0c;通常会创建一个日志表&#xff0c;写入每个关键步骤的信息。也可以向达梦数据库的告警日志输出信息&#xff0c;然后通过查看告警日志即可。 在达梦的告警日志中输出一个信息可以这样 SQL> DBMS_SYSTEM.KSDWRT(2,hi dm);

MySQL 索引事务

目录 1. 索引是什么 2. 索引的相关操作 3. 索引的原理 4. 事务是什么 5. 事务的使用 6. 事务的原理 1. 索引是什么 索引是用来加快查询的机制&#xff0c;是针对某个表的指定列来设置的&#xff0c;查询条件如果就是使用这个带有索引的列来查询&#xff0c;那么查询速度…

基于django协同过滤的音乐推荐系统的设计与实现

一、摘要 随着现代音乐的快速发展&#xff0c;协同过滤的音乐推荐系统已成为人们业余生活的需求。该平台采用Python技术和django搭建系统框架&#xff0c;后台使用MySQL数据库进行信息管理&#xff1b;通过用户管理、音乐分类管理、音乐信息管理、歌曲数据管理、系统管理、我的…

代码随想录算法训练营第51期第14天 | 226. 翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

226. 翻转二叉树 226. 翻转二叉树https://leetcode.cn/problems/invert-binary-tree/1.昨天忘了声明&#xff0c;如果都用C的话&#xff0c;我大概率写不完&#xff0c;所以思路方面&#xff0c;我可能考虑用pyhon先写&#xff0c;后续会用文心一言转换成C 2.这里可以直接用层…

雨晨 24H2 IoT 企业版 ltsc 2024 Hotpatch 极简 26100.2605

文件: 雨晨 24H2 IoT 企业版 ltsc 2024 Hotpatch 极简 26100.2605 install.esd 大小: 1970652896 字节 修改时间: 2024年12月13日, 星期五, 18:06:39 MD5: 3DCB989B62B6656B2CB34B0D88EBEE45 SHA1: C6E890223892B7A3EDA59E4881C70214DD546DB7 CRC32: 13EDFA89 与往版&#xff…

AI大模型开发实战:基于LangGraph、Ollama构建本地AI智能体

一、理解 AI 智能体 AI 智能体是能够感知其环境并采取行动以实现特定目标的实体或系统。这些智能体可以从简单的算法到能够进行复杂决策的复杂系统。 以下是关于 AI 智能体的一些关键点&#xff1a; &#xff08;1&#xff09;感知&#xff08;Perception&#xff09;&#x…

SpringCloud微服务开发(三)网关

目录 1.网关概述 2.网关路由 3.网关登录校验 3.1自定义过滤器 3.2实现登录校验 3.3微服务获取用户 3.4OpenFeign在不同微服务之间传递用户 4.网关配置管理 5.配置热更新 6.动态路由 1.网关概述 顾明思议&#xff0c;网关就是网络的关口。数据在网络间传输&#xff0…

利用DFT画有限长序列的DTFT

MATLAB中没有DTFT函数&#xff0c;计算机不可能给出连续结果&#xff0c;可以只能利用DFT的fft函数来实现。 %% L 7; x ones(1, L) figure; tiledlayout(2,3,"TileSpacing","tight") nexttile; stem([0:L-1],x) box off title([num2str(L), points rect…

MYSQL索引的分类和创建

目录 1、聚簇索引和非聚簇索引 tips&#xff1a; 小问题&#xff1a;主键为什么建议使用自增id? 2、普通索引 &#xff08;常规索引&#xff09;(normal) 3、唯一索引&#xff08;UNIQUE &#xff09; 唯一索引和主键的区别&#xff1a; 唯一约束和唯一索引的区别&#…

Artec Leo3D扫描仪在重型机械设备定制中的应用【沪敖3D】

挑战&#xff1a;一家加拿大制造商需要有效的方法&#xff0c;为富于变化且难度较高的逆向工程&#xff0c;快速、安全、准确地完成重型机械几何采集。 解决方案&#xff1a;Artec Leo, Artec Studio, Geomagic for SOLIDWORKS 效果&#xff1a;Artec Leo三维扫描代替过去的手动…

数据驱动模型预测控制应用于自动驾驶车辆转向

Application of Data-driven Model Predictive Control for Autonomous Vehicle Steering 数据驱动模型预测控制应用于自动驾驶车辆转向 Abstract With the development of autonomous driving technology, there are increasing demands for vehicle control, and MPC has b…

Elasticsearch 架构及 Lucene 索引结构原理入门

文章目录 Elasticsearch 整体架构Lucene 索引结构Lucene 倒排索引核心原理倒排索引倒排表&#xff08;Posting List&#xff09; Elasticsearch 整体架构 一个 ES Index 在集群模式下&#xff0c;有多个Node&#xff08;节点&#xff09;组成&#xff0c;每个节点就是ES的 inst…

【源码阅读系列】(四)进程间通信(一)

进程间的通信 为什么需要进程间通信&#xff1f; 操作系统中的进程隔离机制确保了各个进程在独立的内存空间中运行&#xff0c;并通过严格的机制防止进程间的非法访问。然而&#xff0c;在某些场景下&#xff0c;进程间的通信&#xff08;Inter-process Communication, IPC&a…

直线导轨使用润滑脂和润滑油的区别

直线导轨在使用过程中&#xff0c;润滑是非常重要的一环&#xff0c;它能够减少摩擦、降低磨损、防止腐蚀&#xff0c;并提高导轨的精度和使用寿命。润滑脂和润滑油是两种常用的润滑剂&#xff0c;它们各自有不同的特点和适用场景。 润滑脂是由基础油、增稠剂和添加剂组成的半固…

echarts绘制自定义展示排名和数据等信息(数据排名进度条)

目录 一、结构分析 二、配置图表各部分 1.名称及排序 2.进度条绘制 3.数据末端圆形绘制 &#xff08;1&#xff09;基本配置 &#xff08;2&#xff09;数据 &#xff08;3&#xff09;坐标轴配置 &#xff08;4&#xff09;点的样式 &#xff08;5&#xff09;项的样…

CV(4)--边缘提取和相机模型

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 边缘提取&#xff08;涉及语义分割&#xff09;&#xff1a; 图象的边缘是指图象局部区域亮度变化显著的部分,也有正负之分&#xff0c;暗到亮为正 求边缘的幅度&#xff1a;sobel&#xff0c;Canny算子 图像分高频分量和低…

【Linux】Nginx一个域名https一个地址配置多个项目【项目实战】

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…