使用黑名单完成,Jwt退出登录操作

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 使用黑名单完成,Jwt退出登录操作

目前存在问题

我们之前可以使用退出登录接口直接退出,用户Session中的验证信息也会被销毁,但是现在是无状态的,用户来管理Token令牌,服务端只认Token是否合法,那这个时候该怎么让用户正确退出登录呢?

首先我们从最简单的方案开始,我们可以直接让客户端删除自己的JWT令牌,这样不就相当于退出登录了吗.

这样虽然是最简单粗暴的,但是存在一个问题**,用户可以自行保存这个Token拿来使用**。虽然客户端已经删除掉了,但是这个令牌仍然是可用的,如果用户私自保存过,那么依然可以正常使用这个令牌,这显然是有问题的。

目前有两种比较好的方案:

  • 黑名单方案:所有黑名单中的JWT将不可使用。
  • 白名单方案:不在白名单中的JWT将不可使用。

黑名单机制实现

这里我们以黑名单机制实现,这里使用redis实现黑名单机制。

导入redis依赖

  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
 </dependency>

编写令牌失效方法

JwtUtils内,编写令牌失效方法

这里先校验令牌,获取令牌,在将他传入加入黑名单的方法

FBQ04A[435{`YZVA4MYX{}5.png

我们创建jwt令牌时,是设置了uuid的,这样确保uuid的唯一性;这里先验证token是不是存在黑名单中,不在就设置过期时间,并将其存入redis中,我们还要设置常量,来区分redis存的内容,因为之后还要存redis

S}B]3L[P3Z(N7OFO$5@]N8W.png

EQ)D`5{]U6I(OH6)L{E4C3B.png

)5~3%5H}1}64D8OF4%%`~R4.png

到此就实现了黑名单

  /**
      * 让指定Jwt令牌失效
      * @param headerToken 请求头中携带的令牌
      * @return 是否操作成功
      */
     public  boolean invalidate(String headerToken){
         // 校验headerToken
         String token = this.convertToken(headerToken);
         if (token == null)
             return false;
         Algorithm algorithm = Algorithm.HMAC256(key);
         JWTVerifier jwtVerifier = JWT.require(algorithm).build();
         try {
             DecodedJWT verify = jwtVerifier.verify(token);
             // 加入黑名单
             return deleteToken(verify.getId(),verify.getExpiresAt());
         } catch (JWTVerificationException e) {
             return false;
         }
     }
     /**
      * 将Token列入Redis黑名单中
      * @param uuid 令牌ID
      * @param time 过期时间
      * @return 是否操作成功
      */
     public boolean deleteToken(String uuid, Date time) {
         // 验证Token是否被列入Redis黑名单
         if (isInvalidToken(uuid)) {
             return false;
         }
         // 验证是否过期
         Date now = new Date();
         long expire =Math.max(time.getTime()-now.getTime(), 0);
         // 将Token列入Redis黑名单中
         redisTemplate.opsForValue().set(Const.JWT_BLACK_LIST + uuid,"", expire,  TimeUnit.MILLISECONDS);
         return true;
     }
 ​
     /**
      * 验证Token是否被列入Redis黑名单
      * @param uuid 令牌ID
      * @return 是否操作成功
      */
     private boolean isInvalidToken(String uuid){
         return Boolean.TRUE.equals(redisTemplate.hasKey(Const.JWT_BLACK_LIST + uuid));
     }

完善解析令牌方法

Y0[[B9SUD$KLMVAG2U]R40X.png

完善处理器

回到SecurityConfiguration完善登出处理器

我们照常设置编码类型,再获取令牌,最后调用加入黑名单方法

7QBH6S)$K_OQ2{6_{@~@`R9.png

ok~~,请自行测试

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
8月前
|
存储 JSON JavaScript
前后端分离项目知识汇总(微信扫码登录,手机验证码登录,JWT)-1
前后端分离项目知识汇总(微信扫码登录,手机验证码登录,JWT)
210 0
|
5月前
|
SQL Java 测试技术
在Spring boot中 使用JWT和过滤器实现登录认证
在Spring boot中 使用JWT和过滤器实现登录认证
289 0
|
8月前
|
安全 Java 应用服务中间件
Shiro + JWT 进行登录验证
Shiro + JWT 进行登录验证
63 2
|
3月前
|
JavaScript
Node.js单点登录SSO详解:Session、JWT、CORS让登录更简单(二)
Node.js单点登录SSO详解:Session、JWT、CORS让登录更简单(一)
67 0
|
3月前
|
存储 JSON JavaScript
Node.js单点登录SSO详解:Session、JWT、CORS让登录更简单(一)
Node.js单点登录SSO详解:Session、JWT、CORS让登录更简单(一)
129 0
|
5月前
【Azure APIM】在APIM中实现JWT验证不通过时跳转到Azure登录页面
【Azure APIM】在APIM中实现JWT验证不通过时跳转到Azure登录页面
|
6月前
|
存储 JavaScript 前端开发
文本,三步走构思,富文本点击提交能够存储到数据库当中(下),最快的方法,还是会看资料,因此会整合资料最好,直接看资料最快,因为是JWT的资料,我们要设置好登录的内容,看登录的地方怎样写的
文本,三步走构思,富文本点击提交能够存储到数据库当中(下),最快的方法,还是会看资料,因此会整合资料最好,直接看资料最快,因为是JWT的资料,我们要设置好登录的内容,看登录的地方怎样写的
|
6月前
|
安全 NoSQL Java
JWT和Security 登录权限判断和token访问和让token失效
JWT和Security 登录权限判断和token访问和让token失效
|
7月前
|
JSON 算法 Go
go语言后端开发学习(一)——JWT的介绍以及基于JWT实现登录验证
go语言后端开发学习(一)——JWT的介绍以及基于JWT实现登录验证
|
8月前
|
安全 关系型数据库 MySQL
node实战——后端koa结合jwt连接mysql实现权限登录(node后端就业储备知识)
node实战——后端koa结合jwt连接mysql实现权限登录(node后端就业储备知识)
124 3

热门文章

最新文章