2016-09-06 5 views
1

私はユーザーログインを含むSails.jsアプリケーションを構築しています。ドキュメントが指示したようで、ユーザの兆候は、セッションがそれに応じてセッション中に彼女のIDを記録するとき、:Sails.jsとのセッションで完全なユーザー情報を安全に保存できますか?

req.session.userId = createdUser.id; 
例のほとんどで

は、各ルートは、それが存在だ場合、このIDのルックアップを実行し、送信します見つかった場合、認証されたユーザーをビューに追加します。これは私に非常に非効率的なものです。左上に彼女の名前を表示するには、ログインしたユーザーがいるかどうかをすべてのビューで確認する必要があります。したがって、すべてのルートでこのルックアップを実行するポリシーを作成してコードの量を減らしても、すべてのビューにはデータベースを使用してユーザーを検索することができます。

私はというだろうが、彼女が認証されると、その情報が自動的にすべてのビューに存在するように、セッション中にユーザーの情報を記録している。

req.session.userId = createdUser.id; 
createdUser.loggedIn = true; 
req.session.user = createdUser; 
// the createdUser object does NOT contain the encrypted password or other sensitive info 

この後、私はちょうどにチェックすることができますlayout親テンプレート(および任意の子テンプレート)のように、サインインしたユーザーのテンプレート。 (私はサーバー側のビューを使用しています)。

{% if (session.user && session.user.loggedIn) %} 
<li><a href="/profile/{{ session.user.id }}">Hi there, {{ session.user.username }}</a></li> 
{% else %} 
<li><a href="/signin">Sign In (if you want)</a></li> 
{% endif %} 

私の質問は、これはあらゆる種類のセキュリティ上のリスクがあるかどうかです。これは、すべてのビューでユーザーを検索するよりも効率的ですが、文書がこれを助言しているような理由が考えられます。実施例のほとんどで

答えて

2

それは本だとFYI

を発見し、理想的にはこれはによって処理されるべきかのビューに認証されたユーザを送信 場合、各ルートは、このIDで検索を実行しポリシー。

これは非常に非効率的です。 の左隅に彼女の名前を表示するには、ログインしたユーザーがいるかどうかをすべてのビューで確認する必要があります。だから私が正しいと理解すれば、 への旅行には、すべてのルートでこのルックアップを実行するポリシーを作成してコード の量を減らしても、ユーザーを検索するデータベースが含まれています。

データベースに余分な往復を行うか、セッションを拡張しますか。どちらも長所と短所があります。例えば。拡張する必要のないバックエンドアプリケーションを作成するときには、この余分なデータベースルックアップについては気にしません。しかし、私が何十万人ものユーザーを抱えているときには気をつけなけれアプリケーションを設計するときは、これを考慮する必要があります。例えば、使用するように拡張する必要があるアプリケーション。最適化のためのセッションストアとしてのredis。

あなたの質問に答えるには、はい、セッションオブジェクトにユーザー名などを格納して、余分なデータベース検索を避けることは大丈夫です。私はセキュリティ専門家ではありませんが、パスワードのような機密ユーザー情報をセッションに保存することはお勧めしません。

私は非常にhttp://passportjs.org/を使用することをお勧めします。それは非常によく帆と統合されます。

はあなたが始めるには:この例では

  1. http://iliketomatoes.com/implement-passport-js-authentication-with-sails-js-0-10-2/
  2. https://www.airpair.com/express/posts/expressjs-and-passportjs-sessions-deep-dive

をユーザー名、電子メールやユーザーの役割は、セッションオブジェクトに格納されているかを確認することができます

passport.serializeUser(function(user, done) { 
    var sessionUser = { _id: user._id, name: user.name, email: user.email, roles: user.roles } 
    done(null, sessionUser); 
}); 
+0

ちょうど私が必要としたものです - ありがとう! –

関連する問題