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
})
}));
Node.js express-session 服务器主动删除指定用户的session问题
在最近的项目中,遇到一个问题。在每次用户登录的时候,都把用户的信息保存在session值中。因此,在后台管理端将用户删除后,如果此用户的信息仍然保存在session中,并且此用户一直没有重新登录,则无法达到删除的效果,即用户仍然可以登录并进行操作。
现在需要解决的问题是在服务器端主动删除此session,以达到彻底删除用户的效果。
示例代码及解释
首先,确保你的Express应用已经安装了express-session
和connect-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);
});
解释
- 获取session存储对象:通过
app.get('sessionStore')
获取到session存储对象,这样可以直接访问和操作session数据。 - 定义删除函数:
deleteSessionByUserId
函数接受一个用户ID作为参数,遍历所有session,找到与该用户ID匹配的session并删除。 - 遍历和删除:在回调函数中,使用
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')
获取到存储对象,从而进行删除操作。