使用jwt和redis鉴权

img

img

登录时把jwt存入redis,并设置过期期间;请求进来时用拦截器判断携带的token是否有效,并且是否在redis中存在,两者都满足的话放行。
登出的时候,把redis中的token删除即可。
这样的实现有问题吗,如果有可以改进吗?

这个实现方式基本上是可行的,但是有一些改进可以考虑:

  1. 存储的 token 没有设置有效期,容易引起安全问题,应该设置 token 的有效期,过期的 token 应该被清除。

  2. 存储和验证 token 的操作是分离的,可能会增加系统的复杂度。可以考虑使用一些已有的后台框架(如 Spring Security),它们可以提供集成的解决方案来处理 token 的生成、验证和存储等操作,避免手动实现可能带来的问题。

  3. 如果是分布式系统,可以考虑使用分布式和高可用的缓存(如 Redis 集群或者 Redis Sentinel),避免单点故障。另外,还需要注意 Redis 的持久化问题,选择适当的持久化方案,以便系统在出现故障时能够快速恢复。

  4. 登出操作需要清除 Redis 中的 token,这样会导致一些额外的网络开销。一种更好的实现方式是使用黑名单机制,将已登出的 token 标记为无效,这样就不需要每次都查询 Redis。

总的来说,存储 jwt 并将其存储到 Redis 中,是一种行之有效的方案,但需要合理设置 token 的有效期,使用适当的框架来降低系统复杂度,并考虑分布式缓存和黑名单机制等因素以提高系统的可靠性和安全性。同时也需要注意 Redis 的持久化机制,以便系统能够在出现故障时快速恢复。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/380154
  • 这篇博客你也可以参考下:jwt与token+redis,哪种方案更好用?
  • 除此之外, 这篇博客: 关于jwt的token是否需要存储到redis的探讨与个人想法中的 jwt的结构 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    jwt包含了使用.分隔的三部分:

    • Header 头部
    • Payload 负载
    • Signature 签名

    其结构看起来是这样的

    xxxxx.yyyyy.zzzzz
    

    在查阅大量资料后得知,jwt中的token是储存在客户端中,通过请求头添加

    Authorization: Bearer <token>
    

    的方式向后台发送请求,从而进行用户认证,是一种无状态的认证机制,而服务端将会检查请求头Authorization中的jwt信息,如果合法,则允许用户的行为。

  • 以下回答来自chatgpt:

    针对使用jwt和redis鉴权的问题实现的优化:

    1. 更高效或更安全的实现

    (1)使用jwt的时候,每次校验都需要从Redis中获取对应的key-value值,如果Redis中存在大量数据,会严重影响查询效率。可以考虑使用Redis的Sorted Set(有序集合),将key-value对作为Sorted Set中的members,value为分数(score),使用时间戳作为分数,根据分数的范围查询某个时间段内的数据,避免全局遍历,提高查询效率。

    (2)可以使用加密算法对jwt中的payload进行加密,增加jwt的安全性。常见的加密算法有AES、RSA等。

    1. 添加更多的功能

    (1)限制账户同时在线、登录。或者限制账户并发数。可以使用Redis的Hash实现,将用户的登录信息作为Hash的fields,value可以是一个在线标识,例如IP地址等,然后在用户登录时添加hash-field键值对,用户退出登录时删除该hash-field,这样就可以轻松实现限制账户同时在线、登录。

    (2)根据业务需要,可以增加权限控制逻辑,例如JWT中添加身份角色等信息,同时在校验jwt时对角色进行校验,控制用户权限;也可以在Redis中存储用户的角色信息,然后在用户访问时对用户的角色进行鉴权。

    示例代码中已经展示了部分相关代码,具体的实现可以根据具体的业务需求进行选择,以上只是一些常见的方案。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^