清除单个用户的所有会话

时间:2015-01-14 16:35:17

标签: node.js redis passport.js

在我的网站上,我想要一个组织管理员能够重置用户密码的表单。理想情况下,当重置时,我想从我的RedisStore中清除该用户的所有已识别会话,该会话包含快递和护照的会话数据。有没有人想出办法来做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以快速从Redis中按键找到项目,但由于识别正确会话所需的数据位于值中,您需要查看所有键并查看哪些键属于相关用户。

您可以在登录时按用户名存储会话ID,然后当您需要删除会话时,您只需从列表中获取密钥并删除它们,然后删除列表。

var client = redis.createClient();
// Add the session ID to a set (if not there already)
passport.use(new LocalStrategy({passReqToCallback: true}, function (req, username, password, cb) {
  // Do normal login stuff first. 
  // RedisStore adds 'sess:' to session ID when making it a key
  client.sadd("sessions:" + user.username, "sess:" + req.session.id);
  cb(null, user);
}));

然后删除会话:

var deleteSessions = function(username, cb) {
  client.smembers("sessions:" + username, function(err, sessionIds) {
    if (sessionIds.length === 0) return cb();
    // Delete all sessions
    client.del.apply(client, sessionIds);
    // Delete the set containing now deleted session IDs
    client.del("sessions:" + username);
    cb();
  });
};