首页 > 其他分享 >jwt+token,springsecurity认证方式总结

jwt+token,springsecurity认证方式总结

时间:2022-10-28 17:36:14浏览次数:61  
标签:登录 jwt redis 用户 springsecurity token 认证

基于redis的认证方式分析

redis解决短信验证码时效性,以及使用token的方式判断是否登录的问题。(没用jwt)
这里面使用两个拦截器的方式解决:1. 给token有效期刷新 2.判断用户是否已登录

目前验证用户是否已登录,仍然是用到redis和服务端程序去判断,这个和使用session的判断方式有点相似,因为也会用到服务端资源。
但是token与session还是有非常大的不同,认证通过后,(认证信息)session都是保存在内存中(服务端服务器中)占内存,如果是分布式的架构,那么也会影响性能。

而对于token的方式,认证通过后,(认证信息)token都是保存在redis中的,即使是分布式系统,对于该token都能拿到。也就实现了单点登录 就是在多个系统中,用户只需一次登录,各个系统即可感知该用户已经登录。
且能控制用户登录状态的。

jwt分析

头部,载体,签名
服务端根据秘钥信息,生成jwt(token),将token作为数据返回,然后用户每次请求过来都在请求头携带该token。
如果用户携带token过来,服务端会用秘钥去解析该token,看是否通过。如果通过则代表该用户已登录。

key-value : token-userInfo 存入redis中
可以控制该token的有效期(也就是用户登录的有效期),且能够将用户的一些信息保存到redis中

用户请求到达服务端,服务端根据秘钥再签发一个jwt(token),与用户携带的token作比较,如果一致,则再去操作redis

security认证授权分析

认证流程:
调用框架方法,重写登录认证逻辑,JWT的载体可以存东西
将token返回给用户,让他每次访问都携带过来。
而解析token能得到它里面的载体,包含key的信息,能根据这个条件去redis中查找用户是否已经登录已经他的权限信息。
要让用户注销,那么就删除redis中的对应k-v,那么如果它再想请求需要登录才能访问的接口,会被jwt拦截器给拦截住。
每次用户访问需要登录才能访问的接口时,都会走jwt拦截器这么一个流程。

网上看到的解决方案,就是将权限信息也放在jwt的载体中,而不是redis的v中。这样符合逻辑吗?
答:不行。1.此时的放redis中起到一个单点登录,且能做登录超时下线的功能,能够控制用户的状态。只使用jwt的话,是无法控制用户登录状态的。

如果需要给这个方案加一个token刷新机制呢?
加一个过滤器,拦截所有请求,且在jwt过滤器之前执行。实质上就是刷新该用户对应于redis中的key。
如果请求头中没有携带token => 直接放行
如果携带了 => 那么jwt解析token => 去redis中操作 => 判断该key是否过期
=> 是,放行
=>否,更新token有效期

再次回顾了security的知识,三更的那个jwt过滤器是必要的,这种方式和session的方式还是具有区别。

  1. 对于session的方式,(认证信息)session都是保存在内存中(服务端服务器中)占内存
  2. 对于token的方式,认证通过后,(认证信息)token都是保存在redis中的
  3. 且重新整合加入了token刷新机制

标签:登录,jwt,redis,用户,springsecurity,token,认证
From: https://www.cnblogs.com/pzistart/p/16836816.html

相关文章

  • accessToken获取方法
    百度的教程太笼统了一开始没看懂,解释一下accessToken获取方法他这个教程里,在这个例如里有一长串网址,把这个复制下来,然后把这个里面的client_id=后面的改成你百度智能云项......
  • JWT的介绍和使用
    JWT的含义Jsonwebtoken(JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(RFC7519),该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(sso)......
  • Token需要缓存到Redis的原因
    1、实现单点登录假设:有设备AB、无单点登录限制的某APP、一个账号(用户)设备A在APP第1次登录用户,服务器会给该用户创建1个Token并返回到设备A,设备A会将该Token保存到本地......
  • openstack出现 CRITICAL keystonemiddleware.auth_token或dashboard无法获取实例信息
    问题背景在清理空间的时候误删service项目,导致openstack环境无法使用dashboard登录账户,出现无法获取使用信息等错误在命令行查看各种服务,出现HTTP503[root@node06~]#......
  • 【Java】来回顾下JWT知识点,了解一下什么是JWT?
    (回顾下JWT知识点)1.什么是JWT在介绍JWT之前,我们先来回顾一下利用token进行用户身份验证的流程:1.客户端使用用户名和密码请求登录。2.服务端收到请求,验证用户名和密码......
  • nodejs实现jwt
    jwt是jsonwebtoken的简称,本文介绍它的原理,最后后端用nodejs自己实现如何为客户端生成令牌token和校验token1.为什么需要会话管理我们用nodejs为前端或者其他服务提供......
  • [java]StringTokenizei总结
    构造函数三种StringTokenizer(Stringstr)//构造一个用来解析str的StringTokenizer对象。java默认的分隔符是空格("")、制表符(\t)、换行符(\n)、回车符(\r)。Strin......
  • win10下 asp.net 未能加载文件或程序集“stdole, Version=7.0.3300.0, Culture=neutra
    win10下asp.net未能加载文件或程序集“stdole,Version=7.0.3300.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项。系统找不到指定的文件。......
  • Django之使用自定义用户表(AbstractUser)/自定义登录验证(jwt)/获取当前登录用户
    基本步骤:一、自定义用户表:1、自定义的用户表继承AbstractUser;2、settings.py添加配置,指向用户表:AUTH_USER_MODEL='myUser.Account'(子项目名称.用户表models名称);3、......
  • 服务端声网获取Token(Java)
    声网社区已经提供了实例代码:https://github.com/AgoraIO/Tools/tree/master/DynamicKey/AgoraDynamicKey/java稍微要注意一下的:声网提供的生成API接口,有通过uid(int)和acc......