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

SpringSecurity基于JWT实现Token的处理

  前面介绍了手写单点登录和JWT的应用,本文结合SpringSecurity来介绍下在SpringBoot项目中基于SpringSecurity作为认证授权框架的情况下如何整合JWT来实现Token的处理。

一、认证思路分析

  SpringSecurity主要是通过过滤器来实现功能的!我们要找到SpringSecurity实现认证和校验身份的过滤器!

1.回顾集中式认证流程

用户认证
  使用 UsernamePasswordAuthenticationFilter过滤器中 attemptAuthentication方法实现认证功能,该过滤器父类中 successfulAuthentication方法实现认证成功后的操作。认证失败是在 unsuccessfulAuthentication

身份校验

  使用 BasicAuthenticationFilter 过滤器中 doFilterInternal方法验证是否登录,以决定能否进入后续过滤器。

2.分析分布式认证流程

用户认证
  由于分布式项目,多数是前后端分离的架构设计,我们要满足可以接受异步post的认证请求参数,需要修改UsernamePasswordAuthenticationFilter过滤器中attemptAuthentication方法,让其能够接收请求体。
  另外,默认successfulAuthentication方法在认证通过后,是把用户信息直接放入session就完事了,现在我们需要修改这个方法,在认证通过后生成token并返回给用户。
身份校验
  原来BasicAuthenticationFilter过滤器中doFilterInternal方法校验用户是否登录,就是看session中是否有用户信息,我们要修改为,验证用户携带的token是否合法,并解析出用户信息,交给SpringSecurity,以便于后续的授权功能可以正常使用。

二、具体实现

1.创建项目

  创建一个SpringBoot项目.引入必要的依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.bobo</groupId><artifactId>security-jwt-common</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.80</version></dependency><dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.4.0</version></dependency></dependencies>

2.JWT工具类

  引入前面创建的JWT的工具类。


import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.AlgorithmMismatchException;
import com.auth0.jwt.exceptions.SignatureVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;import java.security.SignatureException;
import java.util.Calendar;
import java.util.Map;public class JWTUtils {// 秘钥private static final String SING = "123qwaszx";/*** 生成Token  header.payload.sing 组成* @return*/public static String getToken(Map<String,String> map){Calendar instance = Calendar.getInstance();instance.add(Calendar.DATE,7); // 默认过期时间 7天JWTCreator.Builder builder = JWT.create();// payload 设置map.forEach((k,v)->{builder.withClaim(k,v);});// 生成Token 并返回return builder.withExpiresAt(instance.getTime()).sign(Algorithm.HMAC256(SING));}/*** 验证Token* @return*     DecodedJWT  可以用来获取用户信息*/public static DecodedJWT verify(String token){// 如果不抛出异常说明验证通过,否则验证失败DecodedJWT verify = null;try {verify = JWT.require(Algorithm.HMAC256(SING)).build().verify(token);}catch (SignatureVerificationException e){e.printStackTrace();}catch (AlgorithmMismatchException e){e.printStackTrace();}catch (Exception e){e.printStackTrace();}return verify;}
}

3.用户实例

  创建用户的实例,添加必要的属性

@Data
public class UserPojo implements UserDetails {private Integer id;private String username;private String password;private Integer status;@JsonIgnore@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {List<SimpleGrantedAuthority> auth = new ArrayList<>();auth.add(new SimpleGrantedAuthority("ROLE_ADMIN"));return auth;}@Overridepublic String getPassword() {return this.password;}@Overridepublic String getUsername() {

相关文章:

SpringSecurity基于JWT实现Token的处理

前面介绍了手写单点登录和JWT的应用,本文结合SpringSecurity来介绍下在SpringBoot项目中基于SpringSecurity作为认证授权框架的情况下如何整合JWT来实现Token的处理。 一、认证思路分析 SpringSecurity主要是通过过滤器来实现功能的!我们要找到SpringSecurity实现认证和校验…...

TCP的三次握手与四次挥手:建立与终止连接的关键步骤

引言 ‌TCP&#xff08;传输控制协议&#xff09;工作在OSI模型的传输层‌。OSI模型将计算机网络功能划分为七个层级&#xff0c;从底层到顶层依次是&#xff1a;物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。传输层负责在网络节点之间提供可靠的端到端通信&a…...

某住宅小区地下车库安科瑞的新能源汽车充电桩的配电设计与应用方案

摘要&#xff1a; 文中以某住宅小区建设工程为例,重点研究了住宅小区地下车库新能源汽车充电桩配电设计,从位置设置、安装方式选择、配电箱设置、配电箱回路设置、供配电系统设计等方面展开分析,提出了民用建筑充电桩设计的科学建议,为新能源充电桩的推广应用提供参考。 关键…...

登录次数限制

文章目录 一、应用场景与设计目的1. 应用场景2. 设计目的 二、功能设计1. 登录限制规则2. 解锁机制3. 适用维度 三、技术实现1. 数据存储2. 逻辑流程3. 实现代码示例4. 动态锁定时间 四、安全增强与扩展1. 防止用户名枚举2. 加入验证码3. 监控与报警4. 分布式支持 五、设计思考…...

java jar包内的jar包如何打补丁

问题描述&#xff1a; 主包&#xff1a;hisca.jar&#xff0c;解压后 BOOT-INFO/lib下有其他jar包 因为一个小bug&#xff0c;需要修改这个hisca包下BOOT-INF/lib下的子jar包service-hisca-impl-1.0.0.jar中的一个service类及xml文件 操作步骤&#xff1a; 1、主包jar -xvf …...

面试(进阶) —虚拟列表在什么场景使用,如何实现?

面试(进阶) —虚拟列表在什么场景使用&#xff0c;如何实现&#xff1f; 在前端开发中&#xff0c;当需要渲染大量数据时&#xff0c;传统的渲染方式往往会遇到性能瓶颈。一次性将大量数据渲染到DOM中&#xff0c;不仅会导致页面加载缓慢&#xff0c;还可能占用大量内存&#x…...

深入了解 NAT 模式:网络地址转换的奥秘

深入了解 NAT 模式&#xff1a;网络地址转换的奥秘 在计算机网络的世界里&#xff0c;NAT 模式&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;扮演着至关重要的角色。它就像是网络中的翻译官&#xff0c;在不同网络地址之间进行转换&#xff0…...

Android Studio 新版本Gradle发布本地Maven仓库示例

发布代码到JitPack示例&#xff1a;https://blog.csdn.net/loutengyuan/article/details/145938967 以下是基于 Android Studio 24.2.2&#xff08;Gradle 8.10.2 AGP 8.8.0 JDK17&#xff09; 的本地 Maven 仓库发布示例&#xff0c;包含aar和jar的不同配置&#xff1a; 1.…...

无服务边缘融合架构:重新定义云原生应用边界

引言&#xff1a;零部署计算的革命突破 Airbnb迁移至LambdaEdge架构后&#xff0c;全球客房详情页渲染延迟降至35ms&#xff0c;冷启动时间缩至50ms以内。Stripe采用无服务边缘计算处理支付事务&#xff0c;成功将动态API响应P99延迟从210ms压缩至19ms。AWS官方基准显示&#…...

数据库测试

TPCH 22条SQL语句分析 - xibuhaohao - 博客园 TPCH模型规范、测试说明及22条语句 - zhjh256 - 博客园 TPC-DS 性能比较&#xff1a;TiDB 与 Impala-PingCAP | 平凯星辰 揭秘Oracle TPC-H性能优化&#xff1a;如何提升数据库查询速度&#xff0c;揭秘实战技巧与挑战 引言 T…...

Nodejs-逐行读取文件【简易版】

“勤奋就是成功之母。”‌ —— 茅以升 目录 逐行读取文件四种方法&#xff1a;Node.js 逐行读取文件的核心方法&#xff1a;同步读取&#xff08;适用于小文件&#xff09;&#xff1a;异步流式处理&#xff08;推荐用于大文件&#xff09;&#xff1a;[使用 readline 模块](h…...

上海市计算机学会竞赛平台2024年5月月赛丙组城市距离之和

城市距离之和 内存限制: 256 Mb时间限制: 1000 ms 题目描述 设 (x,y)(x,y) 与 (x′,y′)(x′,y′) 是平面上的两个点的坐标&#xff0c;它们之间的城市距离定义为 ∣x−x′∣∣y−y′∣∣x−x′∣∣y−y′∣ 给定 nn 个点&#xff0c;请计算所有点对之间的城市距离之和。 …...

穷举vs暴搜vs深搜vs回溯vs剪枝(典型算法思想)—— OJ例题算法解析思路

回溯算法的模版 void backtrack(vector<int>& path, vector<int>& choice, ...) {// 满⾜结束条件if (/* 满⾜结束条件 */) {// 将路径添加到结果集中res.push_back(path);return;}// 遍历所有选择for (int i 0; i < choices.size(); i) {// 做出选择…...

在ubuntu 24.04.2 通过 Kubeadm 安装 Kubernetes v1.31.6

文章目录 1. 简介2. 准备3. 配置 containerd4. kubeadm 安装集群5. 安装网络 calico 插件 1. 简介 本指南介绍了如何在 Ubuntu 24.04.2 LTS 上安装和配置 Kubernetes 1.31.6 集群&#xff0c;包括容器运行时 containerd 的安装与配置&#xff0c;以及使用 kubeadm 进行集群初始…...

基于Python socket库构建的基于 P2P 的文件共享系统示例

基于 P2P 的文件共享系统 实现方式&#xff1a; 使用 Python 的socket库构建 P2P 网络&#xff0c;节点之间通过 TCP 或 UDP 协议进行通信。每个节点维护一个文件列表&#xff0c;并向其他节点广播自己拥有的文件信息。当一个节点需要某个文件时&#xff0c;它会向网络中的其…...

JavaScript 函数重载:灵活应对多场景的编程技巧

在 JavaScript 中&#xff0c;函数重载&#xff08;Function Overloading&#xff09;是一个常见的需求。尽管 JavaScript 本身并不支持传统意义上的函数重载&#xff08;即在同一个作用域内定义多个同名函数&#xff0c;根据参数的不同调用不同的函数&#xff09;&#xff0c;…...

通过 PromptTemplate 生成干净的 SQL 查询语句并执行SQL查询语句

问题描述 在使用 LangChain 和 Llama 模型生成 SQL 查询时&#xff0c;遇到了 sqlite3.OperationalError 错误。错误信息如下&#xff1a; OperationalError: (sqlite3.OperationalError) near "sql SELECT Name FROM MediaType LIMIT 5; ": syntax error [SQL: …...

用大白话解释缓存Redis +MongoDB是什么有什么用怎么用

Redis和MongoDB是什么&#xff1f; Redis&#xff1a;像你家的“小冰箱”&#xff0c;专门存高频使用的食物&#xff08;数据&#xff09;。它是基于内存的键值数据库&#xff0c;读写速度极快&#xff08;每秒超10万次操作&#xff09;。比如你每次打开手机App&#xff0c;用…...

计算机毕业设计SpringBoot+Vue.js汽车销售网站(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

【0010】HTML水平线标签详解

如果你觉得我的文章写的不错&#xff0c;请关注我哟&#xff0c;请点赞、评论&#xff0c;收藏此文章&#xff0c;谢谢&#xff01; 本文内容体系结构如下&#xff1a; 一、水平线标签概述 在HTML中&#xff0c;<hr>标签用于在网页上插入一条水平线&#xff0c;其主要…...

OpenClaw二次开发入门:Qwen3-14b_int4_awq定制化中间件编写

OpenClaw二次开发入门&#xff1a;Qwen3-14b_int4_awq定制化中间件编写 1. 为什么需要定制化中间件 去年我在用OpenClaw对接本地部署的Qwen3-14b_int4_awq模型时&#xff0c;遇到了几个棘手问题&#xff1a;网关日志不完整导致调试困难、某些危险指令被直接执行、模型特有参数…...

C++虚函数关键指南

虚函数 virtual 关键字 使用场景 在基类中声明虚函数&#xff0c;允许派生类重写该函数以实现多态。 行为特点 通过基类的指针或引用调用虚函数时&#xff0c;调用的是对象实际类型&#xff08;派生类&#xff09;的函数版本。 示例代码 class Base { public:virtual void func…...

Pixel Epic · Wisdom Terminal Node.js全栈开发:环境配置与集成AI模型的后端服务构建

Pixel Epic Wisdom Terminal Node.js全栈开发&#xff1a;环境配置与集成AI模型的后端服务构建 1. 前言&#xff1a;为什么选择Node.js构建AI服务后端 Node.js凭借其非阻塞I/O和事件驱动特性&#xff0c;成为构建高并发AI服务的理想选择。特别是当需要处理大量异步AI模型调用…...

OpenTiny NEXT 从入门到精通·第 1 篇

OpenTiny NEXT 从入门到精通第 1 篇&#xff1a;启程篇——初识 OpenTiny NEXT&#xff0c;开启企业级智能前端之旅前端技术日新月异&#xff0c;Vue 2 要停止维护了&#xff0c;团队还在 Vue 2/3 多版本并存中挣扎&#xff1b;业务方希望接入 AI&#xff0c;前端却不知道怎么开…...

OpenClaw新手避坑指南:Qwen3.5-9B对接常见问题解决方案

OpenClaw新手避坑指南&#xff1a;Qwen3.5-9B对接常见问题解决方案 1. 为什么需要这份指南 上周我在本地部署OpenClaw对接Qwen3.5-9B模型时&#xff0c;连续踩了五个坑。从安装报错到模型连接超时&#xff0c;每个问题都消耗了我至少两小时的排查时间。这种经历让我意识到&am…...

调参不再玄学:手把手教你优化智能车(电磁组)舵机PD控制参数,告别‘画龙’

智能车电磁组舵机控制实战&#xff1a;从参数原理到赛道调优的完整指南 当你的智能车在直道上像喝醉一样左右摇摆&#xff0c;或者在弯道犹豫不决时&#xff0c;大多数问题都指向同一个核心——舵机控制参数设置不当。这不是魔法&#xff0c;而是一门可以通过系统方法掌握的科学…...

Latex写论文必看:如何从谷歌学术获取完整的BibTeX引用信息(含Springer/Elsevier/IEEE案例)

LaTeX论文写作进阶&#xff1a;精准获取BibTeX引用数据的全流程指南 作为科研工作者&#xff0c;我们都经历过这样的场景&#xff1a;深夜赶论文时&#xff0c;发现从谷歌学术导出的BibTeX条目缺少关键字段&#xff0c;特别是那些期刊要求的卷号(number)、页码或DOI信息。这种…...

2031年2.9亿美元:全球医用血卡离心机市场增长态势剖析

医用血卡离心机作为实验室关键仪器&#xff0c;在免疫血液学领域发挥着重要作用。它主要用于对凝胶卡或血型卡进行可控、可重复的离心操作&#xff0c;使血浆和红细胞通过凝胶柱或微柱&#xff0c;进而完成血型鉴定、抗体筛查和交叉配血等任务。典型的血卡离心机配备专用转子&a…...

Flet跨平台GUI开发:从入门到实战

1. 为什么选择Flet开发跨平台GUI&#xff1f; 最近几年&#xff0c;Python在GUI开发领域一直缺少一个真正意义上的跨平台解决方案。传统的Tkinter功能有限&#xff0c;PyQt虽然强大但商业授权复杂&#xff0c;Kivy的语法又不够直观。直到我发现了Flet这个宝藏框架&#xff0c;它…...

单片机核心功能解析与实战技巧

1. 单片机学习的核心功能解析作为一名在嵌入式领域摸爬滚打多年的工程师&#xff0c;我深知单片机学习的关键不在于死记硬背&#xff0c;而在于掌握几个核心功能的底层逻辑和应用场景。很多初学者容易陷入"学了很多却不会用"的困境&#xff0c;根本原因就是没有抓住这…...