Gin(十五):JWT使用续

Shiro整合JWT:解决jwt注销和续签的问题 文章目录Shiro管理用户认证时jwt续签和注销的问题1. 场景一:token的注销问题(黑名单)2. 场景二:token的续签问题3. 项目中的实现3.1 封装JWT工具类3.2 配置Shiro的自定义认证类3.3 登录和退出登录(token注销)3.3.1 登录接口3.3.2 退出登录3.3.3 在shiro的自定义认证类中添加认证规则3.4 修改密码(token注销)3.5 token续签问题(token续签)3.6 用户的角色发生了变化(token注销)3.6.1 更新角色3.6.2 删除角色3.6 阅读详情

原文首发 https://youngxhui.top

Gin 教程叕来了(说好的大结局呢?),这次主要是来说明 JWT 存在的一些问题和解决方案。如果你还不知道 JWT 是什么,建议了解一下,也可以翻翻前面的文章看看。

💊问题所在

上次写 JWT 的时候,和群里的小伙伴讨论,有小伙伴提出了一些问题,用户修改密码或者注销账户怎么办?

是啊,怎么办?

我们都知道 JWT 是否有效,靠的是失效时间,而且服务器不对用户 JWT 进行保存,也就是一旦签发了的 JWT ,服务器失去了对其的控制权,只能等其过期而失效。如果这样,那么用户修改密码或者注销之后,之前的 JWT 仍旧还可以使用,那么就会带来安全风险。

于是乎,我默默的打开了百(gu)度(ge)

🙄🙄🙄🙄🙄🙄

你们为什么要把 JWT 存在 redis 里?

这是什么操作?一旦服务器去保存 JWT,还用什么 JWT ?普通 token 就完全可以了啊,何必多此一举。

以上就是我们在使用 JWT 的时候产生的问题。

🀄解决问题

既然有了问题,就要解决。

再次回顾一下 JWT 的使用流程。

  1. 浏览器发出登录请求,将账号和密码提交到服务器;

  2. 服务器创建 JWT 并且加密(并不是全部加密,仅仅加密 VERIFY SIGNATURE);

  3. 将 JWT 返回浏览器;

  4. 访问需要授权的接口,将 JWT 携带在Header;

  5. 校验 JWT ,并且从 JWT 获取 JWT;

  6. 响应浏览器。

上面的六个步骤就是 JWT 使用的过程。服务器只做了两步,生成 JWT 和校验 JWT 。而我们解决上述提出的问题,就在服务器端解决。

我们都知道在加密的时候服务器端会保存一个密钥,而校验解密的时候就需要这个密钥,这个密钥就是我们解决该问题的 KEY 。

如果我们把密钥设成动态的,用户密码修改或者注销的时候,该密钥就会发生改变,那么之前签发的 JWT 无法使用新的密钥来解密了,也就意味着之前的密钥已经失效了。而这个动态密钥应该保证独立,每个用户的密钥应该是不一样的,该用户的密钥只负责该用户的 JWT。

于是乎,问题似乎已经解决了,我们可以在数据库用户表中设置一个单独的字段来标识,每次发生密码修改或者账号注销的时候,只需要修改该字段就可以保证之前的JWT失效。或者使用用户的密码作为密钥。

部分代码

UserHandler.go

// 通过密码和保留字段加密
var jwtSecret = []byte(config.Secret + u.Password)
token, err := tokenClaims.SignedString(jwtSecret)

其中 config.Secret 是我们服务器上的固定密钥。

Auth.go

// 分割出来载体
payload := strings.Split(token, ".")
bytes, e := jwt.DecodeSegment(payload[1])

if e != nil {
	println(e.Error())
}
content := ""
for i := 0; i < len(bytes); i++ {
	content += string(bytes[i])
}
split := strings.Split(content, ",")
id := strings.SplitAfter(split[2], ":")
i := strings.Split(id[1], "\\u")
i = strings.Split(i[1], "\"")

ID, err := strconv.Atoi(i[0])
if err != nil {
	println(err.Error())
}

user := model.User{}
user.ID = uint(ID)
u := model.User.QueryById(user)
jwtToken, err := jwt.ParseWithClaims(token, &jwt.StandardClaims{},
	func(token *jwt.Token) (i interface{}, e error) {
		return []byte(config.Secret + u.Password), nil
	})

这里就不展示全部代码了。大家可以看 Github gin_jwt_2 分支上查看。

菜鸟手撸基于gin的jwt+reids登录 菜鸟手撸基于gin的jwt+reids登录 var store = base64Captcha.DefaultMemStore // @Tags Auth // @Summary 用户登录 // @accept json // @Produce json // @Param data body sys_model.RegisterAndLoginStruct true "用户登录接口" // @Success 200 {string} string "{"success":true,"data":{}, 阅读详情

相关推荐

【信息科学与工程学】计算机科学与自动化——第三百零四篇 高性能系统开发指南06

376: 分布式配置中心+配置加密+密钥管理+自动轮换+审计+回滚+健康检查+灰度+多集群+多租户+配置漂移检测+自动修复+合规+联邦学习+混沌工程+事件驱动+多语言SDK+配置可视化+配置模板+变量替换+配置对比+差异可视化+配置导入导出+配置订阅+WebHook+配置权限管理+RBAC+配置标签+配置搜索+配置依赖图+配置影响分析+配置历史趋势+配置预测+配置自动生成+配置推荐+配置健康评分+配置自愈+配置拓扑+配置热加载。故障恢复时,从上一个完成的checkpoint恢复,未提交的文件被丢弃。

weixin_49199313的博客 265

WEB安全(十一)退出登录场景下如何使token失效

使用token做认证授权时,会发现注销登录等场景下token还有效。因为token不同于Session认证方式——用户退出登录时,服务端删除对应的Session记录即可。如果不引入其他机制,则退出登录时,token仍有效,即仍是登录状态,直到token有效时间到。 下面介绍几个方案: 1、直接从客户端移除token 显然,这对服务端的安全性没有任何帮助,但是这的确使客户端退出登录,而且通过删除token来阻止攻击者,因为他们必须在注销之前窃取token。 2、创建token黑名单 可以维护一份token黑名

jinyangjie的博客 7033

TB6600驱动器共阴共阳接法傻傻分不清?一张图搞定STM32与42步进电机的接线避坑指南

本文详细解析了TB6600驱动器共阴共阳接法的本质区别,提供了STM32与42步进电机的高效连接方案。通过实际案例和接线图示,帮助读者避免常见错误,确保驱动器与MCU的安全连接,提升项目稳定性。

weixin_28710999的博客 246

登录又退出后token依然有效问题和取消一号多用问题

添加 Token 拦截器,在请求入口调用,检查 Token 是否在黑名单;确保拦截器拦截所有需要认证的接口,排除公开接口;按这个方案修改后,登出后的旧 Token 就会被拦截,无法再调用接口了。解决 JWT 多设备登录冲突的核心是 “建立用户与最新 Token 的强关联”,通过拦截器实时校验 Token 的有效性和时效性。黑名单机制用于处理主动退出场景,而 “最新 Token 对比” 用于处理被动下线场景;用 Redis 存储 “用户→最新 Token” 的映射,确保查询和更新的高效性;

qq_37377838的博客 1133

项目安全等保测评加固手册

安全等级测评的目的是通过对目标系统在安全技术及管理方面的测评,对目标系统的安全技术状态及安全管理状况做出初步判断,给出目标系统在安全技术及安全管理方面与其相应安全等级保护要求之间的差距。测评结论作为委托方进一步完善系统安全策略及安全技术防护措施依据!!

菜鸟运维升级之路 2417

笔记汇总 | 斯坦福 CS229 机器学习

本文为斯坦福大学 2014 秋季 CS229 机器学习课程学习笔记本文主体部分转载自黄海广博士,文末已给出,大家有兴趣可以直接访问笔记首页,下载对应课程资料及作业代码。

ReturnTmp的博客 2464

8-gin使用JWT认证

什么是JWT JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0认证的业务场景下。 为什么需要JWT 在偏传统的一些web项目中,我们通常使用的是Cookie-Session模式实现用户认证。相关认证流程大致如下: 用户在浏览器端填写用户名和密码,并发送给服务端 服务端对用户名和密码校验通过...

kismile 1027

从梯度泄露到数据复原:DLG与iDLG算法实战解析

本文深入解析了DLG与iDLG算法在梯度泄露与数据复原中的实战应用,揭示了联邦学习中的隐私风险。通过详细代码示例和实验数据,展示了如何从梯度中复原原始训练数据,并探讨了梯度压缩、差分隐私等防御措施。文章特别强调了iDLG算法在标签破解中的高效性,为AI安全领域提供了重要参考。

weixin_30552811的博客 192

Go Gin Example

https://github.com/EDDYCJY/go-gin-example/blob/master/README_ZH.md  Go Gin Example gin 的一个例子,包含许多有用特性 目录 本项目提供 Gin实践 的连载示例代码 Gin实践 连载一 Golang介绍与环境安装 Gin实践 连载二 搭建Blog API's(一) Gin实践 连载三 搭建Blog A...

kangle0228的博客 1960

OpenCv案例(七): 基于OpenCvSharp计算图像的清晰度(自动对焦)

自动对焦,其实是对相机成像的清晰值得计算,若对焦不清晰,成像的清晰度低,视觉效果模糊。若是在工业检测行业,对焦不准确,可能会造成严重后果;对焦准确的图像,其清晰度高,对比度鲜明,层次明显。

qq_37835727的博客 7115

2026年OPPO嵌入式岗位面试题带详细答案

本文总结了OPPO嵌入式岗位面试的核心考点,涵盖硬件驱动、系统启动、Linux内核开发等7大模块共34道典型题目。重点解析了SPI通信协议、中断处理、U-Boot启动流程、Linux驱动开发等关键技术,突出硬件调试与工程实践能力考核。题目设置贴合实际岗位需求,适合校招与社招驱动开发岗位应聘者系统复习,帮助掌握嵌入式开发的核心知识与面试要点。

Open 491

Gin教程_Golang+Gin仿小米商城项目实战介绍

Golang基础,从环境搭建、语言语法 特性到函数式编程、并发编程等等。理论与实战结合,帮助快速掌握Go语言。 教程包括:Golang零基础入门进阶教程(50讲)、Gin基础、Mysql入门实战、Mysql大数据查询优化索引、Mysql事务、Mysql锁、Gorm入门、Gorm实战、Gorm关联查询、Golang+Gin+GORM仿小米商城项目(真实企业级项目实战)

luckysuny的博客 1139

线性自抗扰控制(LADRC)系统算法框图

NLADRC自抗扰控制从Simulink仿真到PLC控制实现_自抗扰控制器 simulink仿真-优快云博客本文介绍了如何将ADRC自抗扰控制算法从Simulink仿真应用到PLC控制中,包括Simulink框图、TD微分器模型、MATLAB函数的使用、SCL控制代码,以及非线性状态误差反馈控制率的实现。提供了详细的MATLAB仿真步骤和PLC源代码链接。ADRC自抗扰控制算法(含梯形图完整源代码和算法公式)_adrc算法-优快云博客。

RXXW_Dor的博客 1464

【GIN+GO】实战-博客

转自: https://segmentfault.com/a/1190000013297625 本系列示例代码 go-gin-example 本系列目录 连载一 Golang介绍与环境安装 连载二 搭建Blog API’s(一) 连载三 搭建Blog API’s(二) 连载四 搭建Blog API’s(三) 连载五 使用JWT进行身份校验 连载六 编写一个简单的文件日志 连载七 Golang优雅重启HTTP服务 连载八 为它加上Swagger 连载九 将Golang应用部署到Docker 连载十 定制

码农印象 347

【Flink】FlinkSQL如何触发执行计算

Table (通过 StatementSet.addInsert() 输出给某个 Sink)和 INSERT 语句 (通过调用 StatementSet.addInsertSql())会先被缓存到 StatementSet 中,StatementSet.execute() 方法被调用时,所有的 sink 会被优化成一张有向无环图。该方法是用来将一个表的内容插入到目标表中,一旦该方法被调用, TABLE API 程序立即被翻译。该方法是用来执行一个 SQL 语句,一旦该方法被调用, SQL 语句立即被翻译。

一杯咖啡半杯糖的博客 1007

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Golang Gin实践 番外 请入门 Makefile

Golang Gin实践 番外 请入门 Makefile 原文地址:Golang Gin实践 番外 请入门 Makefile 前言 含一定复杂度的软件工程,基本上都是先编译 A,再依赖 B,再编译 C...,最后才执行构建 如果每次都人为编排,又或是每新来一个同事就问你项目 D 怎么构建、重新构建需要注意什么...等等情况,岂不是要崩溃?...

weixin_33744141的博客 210

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Golang Gin实践 连载十六 在图片上绘制文字

Golang Gin实践 连载十六 在图片上绘制文字 原文地址:Golang Gin实践 连载十六 在图片上绘制文字项目地址:go-gin-example 前言 本章节是 连载十五 的补充内容,建议一同食用。主要实现合并后的海报上绘制文字的功能(这个需求也是常见的很了),内容比较简单 实现 这里使用的是 微软雅黑 的字体,请点击进行下载并...

weixin_34246551的博客 390

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Go 语言从入门到后端项目实战完整指南

本指南系统讲解 Go 语言核心知识,涵盖环境安装、基础语法、结构体、接口、错误处理、Goroutine、Channel、Go Modules、Gin Web 开发、MySQL、Redis、GORM、JWT 鉴权、Docker 部署、微服务入门、学习路线、官方文档资源与高频面试题答案,适合零基础入门、前端转后端、后端进阶和项目实战学习。封面图我按“后端技术文章封面 / Go 语言 / 云原生 / 并发 / API 服务”方向生成。

zzwokstyle的博客 545

Redis 入门笔记(后端开发必学)

超高速内存数据库真实开发里:缓存登录状态验证码排行榜热点数据而且:几乎属于标配组合。

lihaoweiwudi_的博客 1041

CORS 入门笔记(前后端跨域)

CORS:跨域资源共享浏览器允许不同网站之间互相请求数据的规则必须:协议域名端口同源很多时候:明明只发了一次请求为什么后端收到两次?预检请求(OPTIONS)真实项目:一般:允许所有网站},},},}))浏览器的跨域安全机制后端通过 Header 告诉浏览器:“我允许你访问”前端请求↓浏览器检查是否跨域↓后端返回允许跨域 Header↓浏览器决定是否放行。

lihaoweiwudi_的博客 488

前后端交互到底是什么?(超详细理解版)

HTTP协议互联网里的“说话规则”浏览器、前端、后端:都必须遵守它。前端通过 HTTP 请求向后端要数据,后端处理后返回 JSON,前端根据 JSON 更新页面。整个现代 Web 开发:几乎都建立在这个模型上。

lihaoweiwudi_的博客 617

Docker Compose 如何一键部署前后端 + PostgreSQL + Redis?从 ShiyuAdmin 拆解完整部署方案

<think>我们只需要根据要求生成一段≤150字的文章摘要。内容来自提供的文章,关于ShiyuAdmin使用Docker Compose一键部署前后端分离项目。摘要要简洁,涵盖主要点:项目背景、问题、解决方案(Docker Compose)、架构特点、最终效果。需要不超过150字。</think>本文介绍了ShiyuAdmin通过Docker Compose实现一键部署前后端分离系统的实践。针对多组件手动部署复杂的问题,采用前端+后端合并为一个应用镜像,与PostgreSQL、Redis构成三容器架构。核

JavaPub 713

Redis实现JWT提前失效

在这篇文章中,讨论了如何利用Redis实现JWT的提前失效。首先,介绍了JWT的基本结构和过期时间设置机制。然后,探讨了JWT无状态带来的问题,特别是用户退出登录后JWT仍然有效的情况。接下来,详细介绍了如何通过Redis黑名单机制解决这一问题,确保JWT在服务端被标记为无效,从而实现提前过期的效果。最后,提供了具体的代码实现示例,展示了如何在实际项目中应用这一机制。通过这种方式,可以有效地提升系统的安全性和用户体验。

weixin_74171843的博客 1960

使用Go语言实现登录认证系统(gin+redis)

通过以上步骤,我们实现了一个简单的登录认证系统,并使用Redis作为缓存。在实际应用中,我们还可以根据需要进行扩展,如添加用户注册、忘记密码等功能。使用Go语言实现登录认证系统具有高效、简洁的特点,可以提高开发效率。同时,Go语言的并发性能也使得处理大量并发请求更加轻松完整代码示例import ("fmt""log""net/http""strings""time"var (// 存储已登录用户// Redis 客户端// 初始化JWT密钥if err!

weixin_44704554的博客 1634

DRF-JTW

1 JWT认证 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证。我们不再使用Session认证机制,而使用Json Web Token(本质就是token)认证机制。 # Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。 # JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获

Python_anning的博客 868
上一篇: 用 Hugo 和 Firebase 建立自己的博客
下一篇: 这里有一份小白白白式的·图解红黑树(简介&&插入篇)
代码猎奇站
博客等级 码龄7年 39粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值