2015-11-16 127 views
2

我有意思接近(註銷/登出)所有用戶會話的NodeJS註銷的NodeJS所有用戶會話

req.logout()是僅關閉用戶的當前會話。但對於我的安全面板,我想添加選項關閉全部用戶會話。我怎樣才能做到這一點?我正在使用MEAN.JS framework。隨着passport.js庫和MongoDB的保存會話:

// Express MongoDB session storage 
app.use(session({ 
    saveUninitialized: true, 
    resave: true, 
    secret: config.sessionSecret, 
    cookie: { 
     maxAge: 15778476000, 
     httpOnly: true, 
     secure: false 
    }, 
    key: 'sessionId', 
    store: new mongoStore({ 
     db: db.connection.db, 
     collection: config.sessionCollection 
    }) 
})); 

非常感謝你。

+0

如果你不使用任何其他目的的會議,除了認證,你可以簡單地清理你的'sessionCollection'用MongoDB的'sessionCollection.remove({})'命令。它會強制關閉所有活動會話並記錄所有用戶。 –

+0

@LeonidBeschastny但是然後每個人都註銷?我認爲OP只想註銷當前用戶? –

+1

我會將userId(Mongo,uuid,...)存儲在會話中,因此也存儲在MongoDB中。接下來使用該特定ID刪除MongoDB中的所有會話(幾乎是@LeonidBeschastny所說的)。 –

回答

2

使用connect-mongo,該userId被保存在字符串中MongoDB中的會議收集

{ 
    "_id" : "J6fsgZ4d1zKp31ml1MRm18YCdlyhvce-", 
    "session" : "{\"cookie\":{\"originalMaxAge\":15778475958,\"expires\":\"2016-05-17T23:47:27.301Z\",\"secure\":false,\"httpOnly\":true,\"path\":\"/\"},\"passport\":{\"user\":\"56420a5a8c6601ce29bbd1c1\"}}", 
    "expires" : ISODate("2016-05-17T12:48:22.049Z") 
} 

最後,我用這個代碼,以消除他的所有會話:

var mongoose = require('mongoose'), 
Schema = mongoose.Schema, 
Session = mongoose.model('Session', new Schema(), 'sessions'); 


exports.signoutAllSessions = function(req, res) { 
    var socketio = req.app.get('socketio'); 
    var userId = req.user.id; 
    var filter = {'session':{'$regex': '.*"user":"'+userId+'".*'}}; 

    req.logout(); 
    res.redirect('/'); 

    Session.remove(filter,function(err,data){ 
     socketio.sockets.to(userId).emit('user.logout'); 
    }); 
}; 

而一個API路由調用此方法。