2012-02-15 79 views
19

如果用戶已經登錄,並嘗試重新登錄在一個新的實例,我想它註銷其他用戶實例。我不希望同一用戶在我的應用程序中登錄兩次。如何在使用express/connect和會話存儲時查找會話ID?

目前會話存儲在Redis的店,我使用的快遞/連接處理會話存儲。其中一個可能被用來破壞會話中可用的功能如下:

.destroy(sid, callback) 

不過,我需要找到會話ID之前,我打電話.destroy()。在Redis中,用戶名被存儲爲會話的一部分。

問:是否可以查詢Redis的獲取基於用戶名會話ID?

回答

53

req.sessionID將爲您提供該會話的SID。

+2

這是爲什麼不接受的答案? 適合我。謝謝! – 2014-09-22 13:49:00

0

問:是否可以通過查詢Redis來獲取基於用戶名的會話ID?

否。redis中的會話密鑰不是以用戶名命名的。

這裏有一個想法,但:當一個用戶已經登錄嘗試再次登錄,你不能看到的是,在你的應用程序,並且立即銷燬舊的會話,或者不允許他們再次登錄嗎?

15

當用戶在用戶帳戶調用.destroy(sid,fn)的數據庫驗證期間用戶登錄時,使用帳戶存儲SID,然後使用用戶的當前SID更新數據庫中的SID。

在我的情況下使用的MongoDB這是多麼我已經做到了:

app.post('/login', function(req, res) 
{ 
    var sid = req.sessionID; 
    var username = req.body.user; 
    var password = req.body.pass; 

    users.findOne({username : username, password : password}, function(err, result) 
    { 
    ... 
    sessionStore.destroy(result.session, function(){ 
     ... 
     users.update({_id: result._id}, {$set:{"session" : sid}}); 
     ... 
    } 
    ... 
    } 
} 
12

對於最近讀者;因爲第4版

連接中間件不包括在快速所以爲了有req.sessionID工作必須做到以下幾點:

  1. 確保你有你的package.json內cookie-parser ABD express-session模塊。如果它不添加,添加它們:
npm install express-session --save 
npm install cookie-parser --save 
  • 注意有關訂單,而在你的app.js文件要求他們,並添加所需的配置參數。
  • var cookieParser = require('cookie-parser'); 
    var session = require('express-session') 
    app.use(cookieParser()); 
    app.use(session({ 
        secret: '34SDgsdgspxxxxxxxdfsG', // just a long random string 
        resave: false, 
        saveUninitialized: true 
    })); 
    
  • 現在你應該使用req.sessionIDreq.session.id
  • +2

    cookie-parser已被棄用於1.5.0的快速會話(請參閱https://github.com/expressjs/session上的自述文件)。事實上,cookie解析器現在可以導致副作用。 – YiddishNinja 2016-08-09 21:07:21