Nodejs express-session 服务器主动删除指定用户的session问题

Nodejs express-session 服务器主动删除指定用户的session问题

在最近的项目中,遇到一个问题。在每次用户登录的时候,都把用户的信息保存在session值中。 所以现在有个问题,如果在后台管理端把该用户删除,但是由于此用户的信息保存在session中,如果此用户一直没有重新登录,则没有达到删除的效果,即用户仍然可以登录操作。 现在想,能否在服务器端主动删除此session???达到彻底删除用户的效果

var session = require('express-session');
var MongoStore = require('connect-mongo')(session);

app.use(session({
    secret: settings.cookieSecret,
    key: settings.db,//cookie name
    cookie: {maxAge: 1000 * 60 * 60 * 24 * 30},//30 days
    store: new MongoStore({
        db: settings.db,
        host: settings.host,
        port: settings.port
    })
}));

5 回复

Node.js express-session 服务器主动删除指定用户的session问题

在最近的项目中,遇到一个问题。在每次用户登录的时候,都把用户的信息保存在session值中。因此,在后台管理端将用户删除后,如果此用户的信息仍然保存在session中,并且此用户一直没有重新登录,则无法达到删除的效果,即用户仍然可以登录并进行操作。

现在需要解决的问题是在服务器端主动删除此session,以达到彻底删除用户的效果。

示例代码及解释

首先,确保你的Express应用已经安装了express-sessionconnect-mongo模块:

npm install express express-session connect-mongo

接下来,配置express-session中间件,并使用MongoDB作为存储引擎:

var express = require('express');
var session = require('express-session');
var MongoStore = require('connect-mongo')(session);
var app = express();

app.use(session({
    secret: 'your_secret_key',
    resave: false,
    saveUninitialized: true,
    cookie: { maxAge: 1000 * 60 * 60 * 24 * 30 }, // 30天
    store: new MongoStore({
        url: 'mongodb://localhost:27017/session_db'
    })
}));

为了实现服务器端主动删除指定用户的session,你可以通过遍历所有session来找到并删除特定用户的session。以下是一个示例代码:

const sessionStore = app.get('sessionStore'); // 获取session存储对象

function deleteSessionByUserId(userId) {
    sessionStore.getAll((err, sessions) => {
        if (err) {
            console.error('Error fetching sessions:', err);
            return;
        }

        const userSessions = sessions.filter(session => session.user_id === userId);

        userSessions.forEach(session => {
            sessionStore.destroy(session.id, () => {
                console.log(`Session for user ${userId} deleted.`);
            });
        });
    });
}

// 假设你有一个用户ID列表
const userIdsToDelete = ['user1', 'user2'];

userIdsToDelete.forEach(userId => {
    deleteSessionByUserId(userId);
});

解释

  1. 获取session存储对象:通过app.get('sessionStore')获取到session存储对象,这样可以直接访问和操作session数据。
  2. 定义删除函数deleteSessionByUserId函数接受一个用户ID作为参数,遍历所有session,找到与该用户ID匹配的session并删除。
  3. 遍历和删除:在回调函数中,使用filter方法筛选出目标用户的session,并调用destroy方法删除这些session。

通过这种方式,你可以确保在后台管理端删除用户后,相关的session也会被删除,从而彻底移除该用户的所有会话信息。


session能删除的唯一“正确方法” 就是过期。 你要是想针对某一SESSION删除。直接进MONGODB删就行了。

MONGODB集合里,怎么判断是哪个用户呢

express-session + passport 合用才是正道。这样你就不用操作session数据库了。 session数据库里的信息必须严格用过期自动删除的方法。不要乱动。

要实现服务器端主动删除指定用户的session,可以通过express-session中间件提供的API来完成。你可以通过遍历所有session对象并找到对应的用户session,然后手动删除。

以下是一个简单的示例代码,展示如何删除指定用户的session:

const session = require('express-session');
const MongoStore = require('connect-mongo')(session);

app.use(session({
    secret: settings.cookieSecret,
    key: settings.db, // cookie name
    cookie: { maxAge: 1000 * 60 * 60 * 24 * 30 }, // 30 days
    store: new MongoStore({
        db: settings.db,
        host: settings.host,
        port: settings.port
    })
}));

async function deleteSessionByUserId(userId) {
    const sessionStore = app.get('sessionStore');
    const sessions = await sessionStore.getAll(); // 获取所有session对象

    for (const [sessionId, session] of Object.entries(sessions)) {
        if (session.user && session.user.id === userId) { // 假设用户信息存储在session.user.id中
            await sessionStore.destroy(sessionId); // 删除匹配的session
            console.log(`Session with ID ${sessionId} has been deleted.`);
            break;
        }
    }

    if (!sessions[userId]) {
        console.log(`No session found for user with ID ${userId}.`);
    }
}

// 调用函数删除指定用户ID的session
deleteSessionByUserId('some-user-id');

请注意,这里的getAll()方法是MongoStore的一个假设性方法,实际上它可能需要你自己实现或者使用其他方式获取所有session对象。如果MongoStore不提供直接获取所有session的方法,你可能需要自定义一个存储类来实现这个功能。

另外,在实际应用中,你需要确保在调用deleteSessionByUserId函数之前,已经正确地初始化了sessionStore。你可以通过在app实例上设置sessionStore属性来实现这一点:

app.set('sessionStore', new MongoStore({
    db: settings.db,
    host: settings.host,
    port: settings.port
}));

这样可以在后续操作中通过app.get('sessionStore')获取到存储对象,从而进行删除操作。

回到顶部