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

jwt token长度限制_OAUTH.令牌存储介绍以及JWT实现强制登出、登录个数控制

1、令牌存储介绍

TokenStore的实现类,有InMemoryTokenStore、JdbcTokenStore、JwkTokenStore、RedisTokenStore。

1.1 基于内存的 InMemoryTokenStore

  • 优点:单机、简单易用
  • 缺点:a) 重启服务器导致令牌全部丢失,用户需要重新授权。 b) 微服务、分布式系统中无法共享令牌信息。

1.2 基于数据库的 JdbcTokenStore

  • 优点:简单
  • 缺点:数据库有限制性,一旦数据量过大,那么CRUD等操作执行速率就会下降

1.3 基于 Redis 的 RedisTokenStore

token认证信息存储在redis中,token为随机redis key。

  • 优点: 使用缓存存储用户的认证信息,可以撤销用户,强制登录下线
  • 缺点:-

1.4 基于 JWT 的 JwtTokenStore

token认证信息存储在jwt负载中。

  • 优点:无需保存用户认证信息
  • 缺点:无法撤销用户的授权,只能等token过期

2、JWT实现token失效以及登录token个数控制

2.1 oauth认证生成token流程

客户端调用/oauth/token接口,进入TokenPoint中的方法流程,最后调用TokenGranter。

3ef17fd9c907d0d8bdff2c47da942526.png

TokenGranter根据grant_type的不同,调用不同的认证方式,获取用户信息,最后调用TokenService生成令牌。

a52d4629d7ec2768e91b0ad9389502e9.png

生成令牌后,会调用storeAccessToken接口存储token信息,对于JwtTokenStore实现类来说,该接口没有做任何事情,因此我们可以考虑重写该方法逻辑,将token信息存入缓存中。

2.1 登录提出、个数控制思路如下:

  1. 生成Jwt的时候,将Jwt Token存入redis中,采用list数据结构(为了控制登录个数及顺序,key过期时间取item中最大值
  2. 扩展Jwt的验证功能,验证redis中是否存在数据,如果存在则token有效,否则无效,并判断登录个数,若超出登录个数则按顺序移除相应的token
  3. 重写removeAccessToken接口,在该方法内删除redis对应的key 流程图如下:
e98518a2d3652f7b847bd4ead6673ac9.png

网关校

9d0ef88f2bfb35fbfe1c5651a0cf73c2.png

验流程图:

注:为了平滑上线,校验策略先置为false,即不校验token,并将token存入redis中,等上线一段时间,线上大多数用户的token都记录在缓存中后,再开启token有效期校验。
作者:是趴趴熊呀
链接:https://juejin.im/post/6881552786903793677
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章:

  • 空间日志代码_蚂蚁金服研发框架日志隔离解析 | SOFABoot 框架剖析
  • c语言音乐小星星代码_慧编程:编程小课堂NO.1——代码也能唱歌!
  • python即将列入高考吗_Python即将被加入浙江、北京、山东高考科目
  • python实时数据流设计_入门指南:用Python实现实时目标检测(内附代码)
  • docker镜像备份恢复_Docker学习笔记
  • runtimeerror什么原因_什么是内存对齐?Go 是否有必要内存对齐?
  • dubbo源码_Dubbo源码-注册中心
  • python运行不了、显示警告_Python xlrd:禁止显示警告消息
  • linux安装python3环境_Linux环境安装python3
  • 用python打印出一个人的照片_Python用dilb提取照片上人脸的示例
  • getdata提取曲线数据_基于Hypergraph创建曲线(矢量)的结果响应
  • ffmpeg 为取经而来_清华,那个穿越百年而来的白衣少年
  • python 数组 动态赋值_在python中使用numpy创建动态数组
  • java filter 是否能拦截到form表单的所有数据_java 知识点总结(框架篇)
  • python使用xlrd读取xlsx文件_python操作excel文件一(xlrd读取文件)
  • 收藏网友的 源程序下载网
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • Akka系列(七):Actor持久化之Akka persistence
  • Angular 4.x 动态创建组件
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • CSS盒模型深入
  • css系列之关于字体的事
  • Fabric架构演变之路
  • HomeBrew常规使用教程
  • javascript 总结(常用工具类的封装)
  • JAVA之继承和多态
  • yii2中session跨域名的问题
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 你真的知道 == 和 equals 的区别吗?
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 微信公众号开发小记——5.python微信红包
  • 一道闭包题引发的思考
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • ionic入门之数据绑定显示-1
  • UI设计初学者应该如何入门?
  • 我们雇佣了一只大猴子...
  • ​ArcGIS Pro 如何批量删除字段
  • (1)常见O(n^2)排序算法解析
  • (3)llvm ir转换过程
  • (c语言)strcpy函数用法
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (SpringBoot)第七章:SpringBoot日志文件
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (转)h264中avc和flv数据的解析
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .NET命名规范和开发约定
  • .net下简单快捷的数值高低位切换
  • .pyc文件是什么?
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题