如何将用户限制为单个登录会话



我在一个网站上工作,该网站只允许用户进行一次登录会话。如果用户试图从多个位置对网站进行身份验证,则前一个会话将被注销。

给定用户的会话信息将存储在Redis中。

我目前的实现使用了两个Redis数据库。第一个数据库将会话ID存储为关键字,将用户名存储为值。第二个数据库将用户名存储为密钥,并将包括会话ID在内的一些其他信息存储为值。

当用户登录时,会查询第二个Redis数据库以查找现有会话ID。如果找到,则会删除旧会话,这基本上会迫使用户的旧会话注销。删除旧会话后,我们在第一个数据库中创建另一个会话,并使用用户名作为密钥更新第二个数据库中会话ID的值。

这里是使用";redis-cli":

redis-cli
select 2
get username

网站获取上一个会话的会话ID,然后生成新的会话ID…

redis-cli
select 1
del old_session_id
set new_session_id username
select 2
set username new_session_id

这是可行的,但我想优化它。在这个解决方案中,网站会查询Redis两次,因为我们必须获取旧的会话id并将其删除。

我的问题是:我们能把这两个问题结合起来吗?

我的挑战是如何读取命令get username的结果,并针对Redis数据库自动运行del old_session_id

有人能帮我吗?

根据SET文档,您可以添加GET选项来编写密钥并获取其旧值。我会先在数据库2上使用它。如果它返回旧的会话id,则可以使用RENAME更改密钥名称。如果它没有返回旧的会话id,您可以使用另一个SET。

你应该能够让你的设置工作这样的东西:

redis-cli
select 2
set username new_session_id get

如果该命令返回值,则运行以下命令:

redis-cli
select 1
rename old_session_id new_session_id

如果没有返回值,请运行以下命令:

redis-cli
select 1
set new_session_id username

最新更新