【问题标题】:Storing sessions in Redis while being able to revoke all sessions of a user在 Redis 中存储会话,同时能够撤销用户的所有会话
【发布时间】:2023-02-22 08:37:51
【问题描述】:

当用户通过电子邮件和密码或 OAuth(Google、Apple、Facebook...)在我的网站上进行身份验证时,我会使用用户的会话 ID 创建一个 cookie,并将会话数据存储在 Redis 中。

会话数据如下(它被序列化为字符串):

{
  "id": "random_session_id",
  "iat": 1677004020931,
  "userId": "id_of_the_user_who_owns_the_session",
  "device": "Samsung s10",
  "ip": 0.0.0.0,
}

并且用id作为Redis key和过期时间存储,这显然与cookie的maxAgeInSeconds属性相同。

我的问题是当他重置密码时,我需要使用户的所有会话无效. 为此,我考虑在 Redis 中存储带有哈希的会话,如下所示:

 - user_id
   |--> session_id_1
        |--> session_data_serialised
   |--> session_id_2
        |--> another_session_data_serialised
 - user_id_2
   |--> session_id_3
        |--> session_data_serialised
   |--> session_id_4
        |--> session_data_serialised

这种方法的问题是您不能在 Redis 中设置哈希的过期时间,所以这不是我的选择。

然后我虽然创建了另一个缓存,我把每个用户的所有会话都放在其中,但是当会话过期时我还需要从这个缓存中删除条目,这似乎是不可能的。

我应该如何在这里实现我的目标?

【问题讨论】:

    标签: session redis session-state


    【解决方案1】:

    我认为你可以让它更简单的redis结构。

    示例场景:

    • 用户ID是112233
    • 用户登录移动和桌面,因此将创建 2 个会话。

    它是redis结构的可视化,这个使用Redis Strings

    112233:${mobile session id}

    112233:${desktop session id}

    又怎样重置密码时使用户的所有会话无效?例如你可以使用这个命令(或者你可以使用搜索模式来更安全)

    DEL 112233:*

    密钥过期在这种结构中运行良好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      • 2019-07-09
      • 2016-02-17
      • 2020-12-05
      • 2019-05-08
      • 2015-02-20
      相关资源
      最近更新 更多