2012-02-09 12 views
3

Passport.jsミドルウェアソリューションを含む、Node.jsのとExpressの偉大な認証を提供しています:認証ミドルウェアを備えたExpressリソース

ensureAuthenticated = function(req, res, next) { 
    if (req.isAuthenticated()) { 
    return next(); 
    } 
    return res.redirect("/login"); 
}; 

にはどうすれば特急・リソースモジュールでは、このミドルウェアを使用することができますか?残念ながら、

app.resource('users', ensureAuthenticated, require('./resources/users')); 

は機能しません。

答えて

13

私は、これは遅すぎる少し知っている、そしてオリジナルのポストは答えました、しかし、私は同じ答えを探していたと私は他の人が知りたいと思うかもしれないと思った解決策を見つけました。

パスポートからsureAuthenticatedが呼び出されていることを確認してください。

app.resource('users', passport.ensureAuthenticated, require('./resources/users')); 

それがここに発見された:https://gist.github.com/1941301

+0

AFAIK、 'express-resources'はこの種のミドルウェアリレーをサポートしていません。 'app.resource'の3番目の引数はオプションです。 –

+1

これは動作しません。上記の要点は、例としてapp.getを使用しており、express-resourceでは使用していません。 –

0

express-resourceに特定のリソースにミドルウェアを挿入するオプションがあるのか​​どうかはわかりませんが、ミドルウェア内のそのリソースに入っているかどうかはいつでも確認できます。

ensureAuthenticated = function(req, res, next) { 
    if (!/^users/.test(req.url) || req.isAuthenticated()) { 
    return next(); 
    } 
    return res.redirect("/login"); 
}; 
+0

問題は、リソースからensureAuthenticatedを呼び出すことで、私がどのリソースにいるのかわかりません。私はapp.allハンドラを入れて、それはうまく動作します。 Thanks – Patrick

0

これは動作します:

app.get( '/'、ensureAuthenticated、admin.indexを)。

戦略が正しく設定されている限り。私はローカル戦略を使用しています。ガイドをチェックアウト:

http://passportjs.org/guide/username-password.html

+1

エクスプレスリソースでは動作しません。 – Patrick

5

回避策。すべての要求に対する認証を確認し、/ authおよび/ auth/callbackに行く要求は無視します。

app.all('*', function(req, res, next) { 
    if (/^\/auth/g.test(req.url)) { 
    return next(); 
    } else if (req.isAuthenticated()) { 
    return next(); 
    } else { 
    return next(new Error(401)); 
    } 
}); 
+3

うまくいけない誰もが自分のアプリにこれをコピーしています。上記のコードを使用して、 '?auth'を任意の要求に追加すればアクセスできます。少なくとも正規表現を '/^\/auth /'に変更してください –

+2

ありがとう、誰かがそれをコピーした場合には、修正しました。 – Patrick

2

あなたは、各リソースが認証ミドルウェアを使うようにするために、いくつかの魔法を行う必要があります。次の要点は、メニュー構造を使用してこれを達成する方法を説明しています。

https://gist.github.com/3610934

は基本的には、次のロジックが必要です

app.all('/' + item.name + '*', ensureAuthenticated, function (req, res, next) { 
    next(); 
}); 

あなたは、あなたのメニュー構造にリソースが保護されているものを指定することができますし、そして彼らもダウンに、特定の権限のいずれかの種類を必要とする場合HTTPメソッドレベル。

これは誰かを助けてくれることを願っています。

関連する問題