7

まず、同様の質問や役立つ資料が見つかりませんでした。何か見落としがありましたら申し訳ありません!

第二に、私はnode-passportconnect-autheveryauthのような既製のソリューションには興味がありません

今質問に。高速セッションを保存するために Redis を使用しています。私の質問は、ユーザーが認証されているとき (つまり、ユーザー名とパスワードの投稿が行われ、そのようなユーザーがコレクションで見つかった後)、セッションに何を保存する必要があるかということです。

  1. ユーザー オブジェクト全体を格納できます (たとえば、MongoDB から取得した方法)。私が見る欠点の 1 つは、ユーザーが DB で変更されている場合 (プロファイルを編集した場合)、セッションでユーザー オブジェクトを「再設定」する必要があることです。たとえば、ユーザーのプロファイルが管理者によって変更された場合、さらに複雑になります。その場合、セッションはユーザーが変更されたことを認識せず、そのデータを DB から更新する必要があるため、セッションは現在、古いユーザー オブジェクトを保持しています。ユーザーが次回ログインしたときにのみ更新されます。

  2. 「hash => userid」のコレクションを作成し、ハッシュのみをセッションに保存します。次に、すべてのリクエストで、チェックするミドルウェアを呼び出します (以下の疑似コードでは、存在しないハッシュのチェックが省略されています。その場合、ユーザーはセッションの有効期限が切れたため、ログインしていないと見なされる可能性があります)。

    if(req.session のユーザーハッシュ) res.local.user = db.users.findById(db.sessions.findUserIdByHash(req.session.userhash));

    この方法の明らかな欠点は、追加のコレクション (つまり mongodb) またはキー => 値 (つまり redis) のハッシュ => ユーザー ID のストレージであり、古いセッション ハッシュ (スケジュールされたタスク\cron が実行され、古い期限切れのハッシュを削除します)。

  3. #2 に似た別のソリューションでは、3 次元パーティ コレクション/キー => 値ストレージを使用する代わりに、ハッシュを一部のユーザー オブジェクトとして MongoDB に保存します。ただし、この方法では余分なコレクション/redis キー値がなくなりますが、期限切れの古いセッションをクリーンアップするためにスケジュールされたタスクが必要でした。また、期限切れのセッションはおそらく「有効期限」属性によって定義されるため、セッション関連のデータを MongoDB のユーザー オブジェクトに入れる (したがって、ユーザー オブジェクトを巨大にする) 代わりに、アクティブなセッションの 3-d パーティ コレクションを維持する方が簡単です。

私は Node-js を初めて使用します。これが私が尋ねる理由です。また、正解がない場合や、個人の好みに縛られる場合があることも理解しています。

ありがとうございました!

4

1 に答える 1

4

従来のフレームワーク (PHP/ASP など) と比較して、Node/Express でのセッションには特別なことは何もありません。PHP でのユーザー ログインで何をしますか?

ユーザーIDをセッションに保存するだけです。必要に応じて Mongo からユーザー データをプルします。

セッション データは (クライアントが Cookie のようにいじることができないという点で) 安全であるため、適切に認証されたユーザー データを指すセッションのユーザー ID を信頼できます。

于 2013-02-04T17:04:09.863 に答える