当前位置: 首页 > 知识库问答 >
问题:

前端 - JWT 怎么解决用户被禁用的问题?

霍鸣
2023-11-24

使用 JWT 作为用户登录认证的时候,是否需要每次都通过 jwt payload 里面的信息(如 ID)来通过数据库查询出用户?

否则怎么判断当前用户是否已经被禁用、删除、角色权限变化等信息,直接使用 jwt payload 里面的信息很可能已经过时?

共有4个答案

微生昌勋
2023-11-24

首先使用JWT的目的就是做服务端无状态,不想在服务端存储与用户Session有关的数据。而JWT内容仅是简单的Base64编码,故不宜存储敏感信息。一般存储用户ID,或者与用户ID唯一映射的一个字符串(隐藏数据库真实用户ID)。

再回到问题本身,可以考虑使用缓存的方式。比如有个专门封装的校验是否被禁用? 是否被删除? 权限是否发生变化?的服务。这个服务只是网关层的一个小模块,具体实现可依赖Redis等缓存,加快校验速度。

假设Redis里面存储有 被禁用账号列表? 每次查询一下当前账号是否被禁用。若数据量较大时,还可进行分桶?布隆过滤器等手段优化。

延伸一下,这个流程很适合使用责任链设计模式啊。

附加信息比较多,感觉难以做一个通用的解决方案,大概率要根据实际业务来做具体设计。

薛弘济
2023-11-24

一般项目中 jwt不放敏感的信息,通常只是放个userId,封禁,等一系列的变化都是通过userId 去关联查询,而且这些关联信息会存储在缓存中,避免给数据库造成压力

云项禹
2023-11-24

jwt只放用户标识类信息,过多的信息不需要都放在里面,如果需要查询更新用户信息,查redis/数据库里。redis/数据库做好同步

赖淇
2023-11-24

JWT (JSON Web Tokens) 是一种开放标准 (RFC 7519) 定义的方式,用于在网络之间安全地传输信息。这些信息可以用于验证、授权、信息交换等。

关于你的问题,这里有一些可能的解决方案。

  1. 数据库查询:是的,一种常见的方法是在每次发送请求时通过 JWT 的 payload 信息查询数据库以获取用户信息。这可以确保你拥有关于用户的最准确信息,包括他们的角色、权限以及是否被禁用。这需要数据库的配合,可以在每次验证 JWT 时,同时查询数据库进行用户信息的校验。
  2. 刷新令牌(Refresh Tokens):你可以使用一个刷新令牌机制来解决这个问题。基本思路是,当用户登录时,他们将获得一个 JWT 和一个对应的刷新令牌。如果 JWT 过期或无效,他们可以使用刷新令牌来获取新的 JWT。在这个过程中,你可以在后台查询数据库以检查用户的状态,如果用户被禁用,你可以拒绝他们的请求或为他们生成一个新的、无效的 JWT。
  3. 使用密钥库:另一种方法是使用密钥库来存储用户的状态信息。在这种情况下,JWT 不仅会包含用户信息,还会包含一个指向密钥库的引用。当 JWT 被验证时,你可以从密钥库中获取用户的状态信息。如果用户的状态已经改变(例如,他们已被禁用),你可以拒绝 JWT 的验证。

在选择最佳方法时,你需要考虑你的应用程序的具体需求和限制。例如,频繁查询数据库可能会影响性能,而使用刷新令牌可能会增加复杂性并需要额外的安全措施(例如,刷新令牌需要被加密或安全地存储)。

 类似资料:
  • 1.手机翻转,或者折叠屏该怎么监听然后动态重新渲染echarts,需要加防抖或者节流吗? 2.横向条形图,左右两边的label怎么永远出现在可视范围内?比如148.00就已经飘出去了,看不全,还有左侧还有很多留白区域,不够美观 3.饼图中间的title的text和subtext能响应式的改变字体大小吗?像这种情况,字体完全超出了饼图范围

  • markdown图片可以传到本地文件夹但只能传jpg,png传不了,数据库也有路径,但是不渲染出来 头像上传七牛云,密钥和域名都写得对的但点击就报400

  • 如果dev分支里面部分功能要上生产,该怎么做?比如dev里有ACD这四个功能,A还在测试,生产里有CD这几个功能,然后目前要上线B功能,该怎么把B功能合到生产分支里? 首先不能把dev全部合到生产分支,也不能把开发B功能的分支合到生产分支吧?因为开发B功能的分支是由dev拉出来的,也会有A功能的代码。

  • vue2前端跨域问题,后端放置到公网上,所有人都可以访问,还配置了access-control-allow-origin为*,前端拿接口地址到浏览器可以拿到数据,使用apiPost测试,接口可以拿到数据,但是放到前端代码里面就跨域,如下图 vue2前端跨域问题

  • 目前用的是harmonyOS4.0版本,遇到了panel的高度问题,点击panel外的区域也会拖动panel的大小,需求是拖动panel外的区域不会影响panel,而是正常的页面滑动(类似一些著名听书软件的功能),一直没有一个完美的解决方案,期待大佬解惑 尝试过onChange或onHeight事件 高度随mode改变而改变,结果是失败的

  • 本文向大家介绍使用Oracle数据库登录时被告知用户被锁怎么解决,包括了使用Oracle数据库登录时被告知用户被锁怎么解决的使用技巧和注意事项,需要的朋友参考一下 在登陆时被告知test用户被锁   1、用dba角色的用户登陆,进行解锁,先设置具体时间格式,以便查看具体时间   2、查看具体的被锁时间   3、解锁   4、查看是那个ip造成的test用户被锁   查看$ORACLE_HOME/n