springboot项目中如何实现过滤器鉴权
通常来说鉴权都是写在网关当中,对于单体应用也可以在后台服务中通过一个过滤器实现。其实过程与网关当中的没什么不同,只是在gateway当中目前是基于netty响应式的。过程如下:
一、实现Filter接口
定义自己的过滤器,并且实现Filter接口:
public class AuthFilter implements Filter
二、重写doFilter方法
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;try {// 此处省略filterChain.doFilter(request, response);} catch (Exception e) {log.info("[AuthFilter.doFilter] exception: {}", e);}
}
如上代码省略处就是我们需要做业务逻辑处理的地方,我们既然要做鉴权接口,那么通常做法是获取请求头部的内容,如token,然后对token进行验证等等。
三、实现鉴权代码
首先是获取header的关键参数,我此处主要有两个,分别是 token 和 username,分别通过header当中他们的key去获取就可以。
注意我对username进行了解码操作,原因是username有可能是中文,在前端vue的过滤器不允许直接发送UTF-8的中文,所以需要进行编码处理。
如果不能保证username可能为空,需要对其判断后再进行decode,否则会抛出异常。
String token = request.getHeader("AUTHORIZATION");
String username = URLDecoder.decode(request.getHeader("_username"),"UTF-8");
拿到token和username我主要做了下面的判断:
- token不能为空,失败返回未授权错误码。
//token为空
if (StringUtils.isEmpty(token) || "null".equals(token)) {response.sendError(CommonReturnEnum.UNAUTHORIZED.getCode(), CommonReturnEnum.UNAUTHORIZED.getName());return ;
}
- jwt解析token,首先是根据用户名从redis当中获取,token不存在存在,就进行JWT解析验证,失败就直接返回未授权错误码。成功则继续。
//验证token
String tokenCache = redisUtil.getString(JwtUtil.REDIS_TOKEN_PREFIX + username);
if (StringUtils.isEmpty(tokenCache)) {Map<String, String> stringStringMap = JwtUtil.validateToken(token);if (ObjectUtil.isEmpty(stringStringMap)) {response.sendError(CommonReturnEnum.UNAUTHORIZED.getCode(), CommonReturnEnum.UNAUTHORIZED.getName());return;}
}
- redis存在token,与header的对比,不同就去jwt解析,通过则继续,未通过就返回未授权。
//没过期,对比当前token和缓存的token是否一致
if (!token.equals(tokenCache)) {boolean tokenAndUser = JwtUtil.validateTokenAndUser(token, username);if (!tokenAndUser) {response.sendError(CommonReturnEnum.UNAUTHORIZED.getCode(), CommonReturnEnum.UNAUTHORIZED.getName());return;}
}
- token续期。
在前的步骤,即使是redis不存在,或者与header的token不相同,我仍然会通过jwt去解析验证,防止redis数据异常导致问题。
续期的意思就是当用户在token的超时时间内进行了刷新,则我们会重新赋予他一个新的token,这样用户就不需要频繁登录,又不会是账号一直在线。
//token验证通过,token续期
String refreshToken = JwtUtil.refreshToken(token, username);
redisUtil.setObjectExpire(JwtUtil.REDIS_TOKEN_PREFIX + username, refreshToken,JwtUtil.REDIS_TOKEN_EXPIRE_MINUTE, TimeUnit.MINUTES);
四、实现白名单放行功能
针对某些特定的路径,是没有携带token等信息的,所以需要过滤器放行。
我这里将需要放行的白名单配置在yml文件当中:
# 请求白名单
filter:white-list: /user/login,/user/register,/websocket/server/,/integral/pageList
在过滤器使用 @value 获取:
@Value("#{'${filter.white-list}'.split(',')}")
private List<String> whiteList;
在doFilter中遍历放行:
//白名单,放行
for (String url : whiteList) {if (path.contains(url)) {filterChain.doFilter(request, response);return;}
}
以上就是简单的鉴权过滤器的实现。
相关文章:
springboot项目中如何实现过滤器鉴权
通常来说鉴权都是写在网关当中,对于单体应用也可以在后台服务中通过一个过滤器实现。其实过程与网关当中的没什么不同,只是在gateway当中目前是基于netty响应式的。过程如下: 一、实现Filter接口 定义自己的过滤器,并且实现Filt…...
【rust/esp32】在idf中使用embedded-graphics控制st7789 LCD屏幕
文章目录 说在前面模块详情准备工作开始编译烧录结果 说在前面 esp32版本:s3运行环境:esp-idf(std)开发环境:wsl2LCD模块:ST7789V2 240*280 LCDgithub地址:这里 模块详情 某宙的esp32s3开发板 某雪的1.69inch LCD模块…...
YOLOv8如何添加注意力模块?
分为两种:有参注意力和无参注意力。 eg: 有参: import torch from torch import nnclass EMA(nn.Module):def __init__(self, channels, factor8):super(EMA, self).__init__()self.groups factorassert channels // self.groups > 0self.softmax …...
用LibreOffice在excel中画折线图
数据表格如下。假设想以x列为横坐标,y1和y2列分别为纵坐标画折线图。 选择插入-》图表: 选择折线图-》点和线,然后点击“下一步”: 选择:列中包含数据序列,然后点击完成(因为图挡住了数据…...
RabbitMQ 链接管理-发布者-消费者
RabbitMQ连接管理器 using RabbitMQ.Client; using System; public class RabbitMQConnectionManager { private readonly IConnectionFactory _connectionFactory; private IConnection _connection; public RabbitMQConnectionManager(string hostName) { …...
JAVA中的垃圾回收器(3)----ZGC
一)ZGC介绍:是JAVA11新引入的低延迟垃圾收集器 ZGC是一款基于Regin的,暂时没有分代概念的,使用了读屏障,颜色指针等技术来实现并发的标记清除和标记整理算法,一低延迟为主要目标的一款垃圾回收器 ZGC的regin可以分为是下图中具有大…...
IDEA 如何运行 SpringBoot 项目
步骤一:配置 Maven 第一步:用 IDEA 打开项目,准备配置 maven 环境 ,当然如果本地没有提前配置好 maven,就用 IDEA 默认的配置即可 配置 maven 步骤 情况 1:如果本地没有配置过 maven,可以保持如…...
Linux MeterSphere测试平台远程访问你不会?来试试这篇文章
🎬 鸽芷咕:个人主页 🔥 个人专栏:《粉丝福利》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网…...
15.k8s集群防火墙配置
防火墙配置 ######################## # master节点防火墙设置 ######################### 所有master节点开放相关防火墙端口 $ firewall-cmd --zonepublic --add-port6443/tcp --permanent $ firewall-cmd --zonepublic --add-port2379-2380/tcp --permanent $ firewall-cmd…...
Python beautifulsoup网络抓取和解析cnblog首页帖子数据
视频版教程:一天掌握python爬虫【基础篇】 涵盖 requests、beautifulsoup、selenium 我们抓取下https://www.cnblogs.com/ 首页所有的帖子信息,包括帖子标题,帖子地址,以及帖子作者信息。 首先用requests获取网页文件࿰…...
Java集成腾讯云OCR身份证识别接口
一、背景 项目用到身份证识别获取人员信息的功能,于是想到了腾讯云提供这样的API。在整合代码过程都很顺利,利用腾讯云官方SDK很快集成进来。但是在上测试环境部署时有了新的问题,通过Nginx代理后的环境无法访问到目标腾讯云接口,…...
C++之C++11引入enum class与传统enum关键字总结(二百五十一)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…...
如何将word格式的文档转换成markdown格式的文档
如何将word格式的文档转换成markdown格式的文档 前言 A. 介绍Markdown和Word格式文档 什么是Markdown? Markdown是一种轻量级标记语言,旨在简化文本格式化和排版的过程。它以纯文本形式编写,通过使用简单的标记语法,使文档更具…...
Leetcode—2558.从数量最多的堆取走礼物【简单】
2023每日刷题(十二) Leetcode—2558.从数量最多的堆取走礼物 大顶堆实现代码 void swap(int *a, int *b) {int tmp *a;*a *b;*b tmp; }void downAdjustHeap(int *heap, int low, int high) {int i low;int j 2 * i 1;while(j < high) {if(j …...
【如何写论文】硕博学位论文的结构框架、过程与大纲分析
硕士论文可以说是毕业前最重要的一部分,也可以说是展示和检验你3年研究生学习的成果的一个考试。硕士论文答辩和检验合格,才能够顺利拿到毕业生和学位证,可见其重要性。 目录 一、基础框架1.1、摘要(Abstract)1.2、绪论…...
砷化镓(GaAs)纳米线 砷化镓纳米线 GaAs纳米线 瑞禧
砷化镓(GaAs)纳米线 名称:砷化镓(GaAs)纳米线 直径:50-400 nm 长度:10-80μm 纳米线是一种新型的材料结构,具有较小的直径和高的长度比,因此在纳米电子学、光电器件等领域有着广泛的应用前景…...
PostGreSQL:JSON|JSONB数据类型
JSON JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)JSON 是轻量级的文本数据交换格式JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许…...
树----数据结构
树的概念 树是一种非线性的数据结构,它是由 n (n>1) 个有限结点组成一个具有层次关系的集合,它看起来就像一颗倒挂的树,根朝上,叶朝下。由 0 个节点构成的树,叫做空树。 树的特点:每个结点有 0 个或多…...
GitLab定时备份
GitLab定时备份 文章目录 GitLab定时备份GitLab基础环境备份命令自动清理备份上传命令设置定时任务参考链接 GitLab基础环境 部署方式:Docker 版本:16.2.2 备份命令 Notes: 编写sh脚本时,不要使用Windows上的Notepad类似编辑…...
SQL IN 运算符
SQL IN 运算符 IN 运算符允许您在 WHERE 子句中指定多个值。 IN 运算符是多个 OR 条件的简写。 SQL IN 语法 SELECT column_name(s) FROM table_name WHERE column_name IN (value1, value2, ...); 或者 SELECT column_name(s) FROM table_name WHERE column_name IN (SELE…...
终极Web-Check备份恢复指南:数据安全保障策略详解
终极Web-Check备份恢复指南:数据安全保障策略详解 【免费下载链接】web-check 🕵️♂️ 用于分析任何网站的一体化 OSINT 工具 项目地址: https://gitcode.com/GitHub_Trending/we/web-check Web-Check是一款功能强大的开源OSINT工具࿰…...
Seurat实战:如何用FindMarkers函数精准鉴定单细胞亚群(附避坑指南)
Seurat实战:用FindMarkers函数精准鉴定单细胞亚群的7个关键策略 单细胞RNA测序技术正在彻底改变我们对复杂组织的理解能力。在肌肉组织、肿瘤微环境或大脑皮层等高度异质性的样本中,准确识别和注释细胞亚群是每个研究者面临的重大挑战。Seurat工具包中的…...
DBeaver宏参数验证终极指南:确保数据库宏输入安全的完整方法
DBeaver宏参数验证终极指南:确保数据库宏输入安全的完整方法 【免费下载链接】dbeaver DBeaver 是一个通用的数据库管理工具,支持跨平台使用。* 支持多种数据库类型,如 MySQL、PostgreSQL、MongoDB 等;提供 SQL 编辑、查询、调试等…...
mPLUG-Owl3-2B Streamlit交互指南:支持拖拽上传、缩略图预览、错误堆栈定位
mPLUG-Owl3-2B Streamlit交互指南:支持拖拽上传、缩略图预览、错误堆栈定位 🦉 多模态AI本地化交互新体验 基于mPLUG-Owl3-2B多模态模型开发的本地图文交互工具,针对模型原生调用的各类报错做了全面修复,适配消费级GPU轻量化推理。…...
【VS Code】Windows10下VS Code配置Graphviz和DOT语言环境:从零开始到高效绘图
1. 为什么选择GraphvizDOTVS Code组合? 如果你经常需要绘制流程图、组织结构图或者算法示意图,一定遇到过这些烦恼:用鼠标拖拽调整图形太费时间,修改布局要反复操作,多人协作时版本混乱。GraphvizDOT语言正是为解决这些…...
JAVA集成CAS客户端总结
一、依赖<dependency><groupId>org.jasig.cas.client</groupId><artifactId>cas-client-support-springboot</artifactId><version>3.6.4</version></dependency>二、yml配置cas:server-url-prefix: https://xxx.xxx:8443/cas…...
MacBook上5分钟搞定Jmeter接口压测:从下载到脚本自动保存结果(附BeanShell代码)
MacBook高效接口压测指南:5分钟实现Jmeter自动化结果收集 每次遇到偶发性接口问题,手动点击上百次查看结果是不是让你抓狂?作为开发者,我们需要的不仅是工具,更是一套能自动完成脏活的解决方案。今天我们就来彻底解决…...
从PID控制器到语义分割:手把手教你复现PIDNet(附PyTorch代码与Cityscapes实战)
从PID控制器到语义分割:手把手教你复现PIDNet(附PyTorch代码与Cityscapes实战) 在计算机视觉领域,实时语义分割一直是个极具挑战性的任务。想象一下自动驾驶汽车需要在毫秒级时间内准确识别道路上的每个像素属于车辆、行人还是交通…...
深度学习赋能有限元:AI时代的高效仿真
https://mp.weixin.qq.com/s/vDRBNvQfEqf-2U6nEeO5Ow 点击此链接查看详情! 第一天:深度学习与有限元基础 1.有限元分析基础:从理论到实战:【理论知识代码实操】 1.1有限元法的基本原理,如网格划分和节点分析。 1.…...
3个步骤解锁QQ音乐加密文件:QMCDecode让音乐重获自由
3个步骤解锁QQ音乐加密文件:QMCDecode让音乐重获自由 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默认转…...
