ユーザーが既にログインしていて、新しいインスタンスで再度ログインしようとする場合、他のユーザーインスタンスからログアウトしたいと思います。同じユーザーがアプリケーションに2回ログインするのは望ましくありません。
現在、セッションはRedisストアに保存されており、セッションストレージを処理するためにexpress/connectを使用しています。セッションを破棄するために使用できる機能の1つは次のとおりです。
.destroy(sid, callback)
ただし、.destroy()を呼び出す前に、そのセッションIDを見つける必要があります。 Redisでは、ユーザー名はセッションの一部として保存されます。
質問:Redisに問い合わせて、ユーザー名に基づいてセッションIDを取得することは可能ですか?
req.sessionID
は、セッションのIDを提供します。reqはリクエストオブジェクトです。
最近の読者向け。
Connectミドルウェアは、バージョン4以降のExpressには含まれていません。
したがって、req.sessionID
を機能させるには、以下を実行する必要があります。
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.sessionID
と req.session.id
を使用する必要があります。ユーザーアカウントのデータベース検証中にユーザーがログインしたときに、ユーザーが.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}});
...
}
...
}
}
質問:ユーザー名に基づいてセッションIDを取得するためにRedisを照会することは可能ですか?
いいえ。redisのセッションキーは、ユーザー名にちなんで命名されていません。
ただし、すでにログインしているユーザーが再度ログインしようとすると、アプリケーションでそれを確認して、古いセッションをすぐに破棄するか、再度ログインできないようにすることはできませんか?