SpringBoot+Token+Redis+Lua+自动续签极简分布式锁Token登录方案

前言

用SpringBoot做一个项目,都要写登录注册之类的方案
使用Cookie或Session的话,它是有状态的,不符合现代的技术
使用Security或者Shiro框架实现起来比较复杂,一般项目无需用那么复杂
使用JWT它虽然是无状态的,也可以载荷用户数据,但还是有很多缺点
  • 缺点1:设置过期时间后,无法强制让它过期,在有效期内它始终可用
  • 缺点2:一次性的,如果用户数据有变,只能重新生成新的JWT
  • 缺点3:安全性,它是base64加密的,如果载荷有重要数据,可以被抓包解析

JWT不适合登录鉴权,适合应⽤场景:⼀次性验证,比如⽤户注册后发⼀封邮件让用户在有效期内激活账户

所以很多项目用的都是Redis+Token方案,简单方便问题少

流程 + lua优化

  1. 设置一个拦截器,不校验登录接口,拦截其他接口

  2. 登录接口接收前端传来的用户名密码,去数据库查询该用户名是否存在,该密码是否正确

  3. 如果正确则表示登录成功,调用生成Token方法,返回Token给前端

  4. Token使用用户id或账号+时间戳+UUID用MD5加密的一串字符串(不建议用其他数据,因为id或账号极少变更的,变更会增加复杂性)

  5. 生成后存储到Redis,把Token当作键,用户数据当作值,并设置过期时间

  6. 生成Token的方法中,还得防止重复调登录接口,不停生成不同的Token,所以先判断数据库中是否存在键,所以保存token键到redis的同时要在redis中再增加一条用户ID为键Token为值的数据,可以验证该用户是否已经生成过token,如下:
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/d08b6c3c3edd4b78a0fef6869c1ed9f2.png
    在这里插入图片描述

    这个验证token的是已登录后其他请求通过拦截器中验证token的
    在这里插入图片描述
    在这里插入图片描述

  7. 先请求一次reids拿过期时间来判断,再选择生成或者延长

    关于Token续签(延长过期时间)
    假如设置Token五个小时过期需要重新登录,其他的博客可能有刷新token,这些工作需要前端去配合调用,无疑增加了前端和后端的工作量。所以考虑直接用已存在的Token延长时间,因为Token本身是md5加密的,所以安全性还是可以的

  8. 注意到没,判断和生成和续签都需要两次redis请求,一次判断时间,一次读写Token,
    这可能就会导致数据不一致问题,懂了吗?

    所以这部分操作全部交由lua处理
    在这里插入图片描述
    登录方法这个lua脚本中既判断了存在,又判断了是否需要延期,又可以只生成一个token,且只需要请求一次redis。

    接下来是校验其他接口方法,同时也做了验证和续期
    在这里插入图片描述
    这样登录和校验续期都只需要请求一次redis即可,类似分布式锁的实现了,相当于把token当作锁。

    方案只要配置WebMvcConfigurer
    在这里插入图片描述
    自定义一个拦截器,再写一个TokenUtil就好了,是不是很简单
    在这里插入图片描述

虽然方案还有一些不完美的,但是不影响性能和使用。有更好的意见大家提出~

原创不易,请勿盲目copy!

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot是一个开源的Java框架,用于构建独立的、可执行的、生产级的Spring应用程序。它极大地简化了Spring应用程序的搭建和部署过程,提供了一整套开箱即用的特性和插件,极大地提高了开发效率。 Shiro是一个强大且灵活的开源Java安全框架,提供了身份验证、授权、加密和会话管理等功能,用于保护应用程序的安全。它采用插件化的设计,支持与Spring等常用框架的无缝集成,使开发者能够轻松地在应用程序中添加安全功能。 JWT(JSON Web Token)是一种用于在客户端和服务端之间传输安全信息的开放标准。它使用JSON格式对信息进行包装,并使用数字签名进行验证,确保信息的完整性和安全性。JWT具有无状态性、可扩展性和灵活性的特点,适用于多种应用场景,例如身份验证和授权。 Redis是一个开源的、高性能的、支持多种数据结构的内存数据库,同时也可以持久化到磁盘中。它主要用于缓存、消息队列、会话管理等场景,为应用程序提供高速、可靠的数据访问服务。Redis支持丰富的数据类型,并提供了强大的操作命令,使开发者能够灵活地处理各种数据需求。 综上所述,Spring Boot结合Shiro、JWT和Redis可以构建一个安全、高性能的Java应用程序。Shiro提供了强大的安全功能,包括身份验证和授权,保护应用程序的安全;JWT用于安全传输信息,确保信息的完整性和安全性;Redis作为缓存和持久化数据库,提供了高速、可靠的数据访问服务。通过使用这些技术,开发者能够快速、高效地构建出符合安全和性能需求的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值