2012-01-04 9 views
6

すべてのページを読み込む前にauthenticateUser()ミドルウェアを使用しようとしています。 (app.get( '/'、authenticateUser、function()...))のように、各呼び出しでそれをインクルードする代わりに、app.use(authenticateUser)をapp.use(app.router )。Node.js - ミドルウェアのres.redirectに関する問題

しかし、これは機能しませんでした。 authenticateUserは、基本的には次のとおりです。

if (req.session.loginFailed) { 
    next() 
else { 
    if (req.session.user_id) { 
     ... 
     if (userAuthenticated) { 
      next(); 
     } else { 
      req.session.loginFailed = true; 
      console.log('setting loginFailed to true'); 
      res.redirect('/login'); 
     } 
    } 
} 

そしてapp.get( '/ログイン')に私がfalseにreq.session.loginFailedを設定します。

これは動作するはずですが、私は私の実際のページのいずれかのためなど)app.get()またはapp.post(上でそれを呼びたいです。私はそのは

これを行うには良い方法はあります(何回も呼ばれる「trueにloginFailedた設定」、なぜなら1ページのロード時に)多くの異なった要求のために何回と呼ばれる多くを得ると思いますか?または、私は単に私のサイトのすべてのページの前にそれを呼び出す必要がありますか?

答えて

9

私の意見では、チェックアウト回数が多すぎます。ユーザーのログインを処理するルートは1つのみ(ユーザー&のパスを確認し、成功した場合はセッションにユーザー名を格納します)、authミドルウェアは認証が必要なルート(すべてではない)に割り当てる必要があります。

あなたが私のポイントを理解することができますので、私は簡単な例を入れている:あなたが見ることができます

ログインルート

app.post('/login', function (req, res) { 
    var variables_set = (req.body.user && req.body.pass); 
    if (variables_set && (req.body.user === 'username') && (req.body.pass === 'password')) { 
    req.session.username = req.body.user; 
    } else { 
    res.redirect('/login?failed=true'); 
    } 
}); 

認証ミドルウェア

if (!req.session.username) { 
    res.redirect('/login'); 
} else { 
    next(); 
} 

をAlex YoungのNodepadアプリケーションのより完全な例:https://github.com/alexyoung/nodepad(ここでは、そのアプリケーションのためのチュートリアル:http://dailyjs.com/tags.html#lmawa)十分

+1

フェア、その面白い私は実際にnodepadチュートリアルのオフに働いていたので。私のサイト全体がログインしている必要があるので、手動ですべてのルートに含める必要がないように一緒にハッキングしましたが、適切な方法があればそれを含めるだけです。 –

+0

私は@alessioalexに同意します。あなたが配置したアプローチを主張するならば、あなたの 'app.use(authenticateUser)'がセッションミドルウェアの後であることを確認してください。 – danmactough

関連する問題