Express-session - 如何注销 Redis 上的所有用户会话

问题描述 投票:0回答:1

用户可以使用多个设备登录网站,因此我使用以 redis 作为存储的快速会话创建多个会话。现在出于安全原因,在用户密码更新时,我想注销所有用户会话并强制他在所有其他设备上登录。我发现这个NodeJS注销所有用户会话并且它使用mongodb作为存储和一些特殊查询,但是在redis中我不确定我可以做同样的事情,因为普通的redis(不是redis JSON)。 所以问题是如何用redis上的express-session销毁所有用户会话?

更新
只是为了澄清,我想删除特定用户的所有会话。例如,我有 10 个用户,每个用户都使用他的笔记本电脑和手机登录,总共会进行 20 个会话。我希望注销用户的所有会话,这只会清除 2 个会话(笔记本电脑和手机会话)。

解决方案
我通过像这样修改redis中的sessionID键解决了这个问题

会话:${userId}:${randomId}

因此,所有用户都可以拥有多个会话,但他的 sessionID 将以相同的模式开头。 如果您想删除一个用户的所有会话,您只需查找以“session:${userId}:*”开头的键并将其删除。见下图:

const generateSessionKey = (req) => {
  const userId = req.session?.user?.id ? req.session.user.id : '';
  const randomId = Math.random().toString(36).substring(2);
  return `custom:${userId}:${randomId}`;
};

app.use(
  session({
    store: new RedisStore({ client: redisClient, prefix: 'session:' }),
    secret: 'your-secret-key',
    resave: false,
    saveUninitialized: false,
    genid: generateSessionKey, // Use the custom session key generator
  })
);

//to delete the sessions 
app.post("/clear-sessions",async (req,res,next)=>{
  const sessions = await redisClient.keys(`session:${req.user.id}:*`);
  await redisClient.del(sessions);
res.send("OK")
  
})

node.js express redis express-session
1个回答
0
投票

您可以通过在会话存储对象上调用

clear
来完成此操作:

store.clear(回调) 可选

此可选方法用于从存储中删除所有会话。这 一旦存储被清除,回调应该被称为回调(错误)。

来源:https://expressjs.com/en/resources/middleware/session.html

Redis 存储的实现:https://github.com/tj/connect-redis/blob/5f5976ea3a94cf8a62efa5701facc4d1200ae78a/index.ts#L130

© www.soinside.com 2019 - 2024. All rights reserved.