2012-09-05 11 views
19

NodeJSとExpressJS(MVC用)の最新バージョンを使用しています。NodeJS + Express:URLを保護する方法

私は通常、たとえば、次のように私の残りのパスを設定します。

app.get('/archive', routes.archive); 

は、今私は、私は単純な認証を必要とする意味、確保するためのURLの私の/admin/*セットをしたい、それだけでドラフトです。

ユーザが対応するビューとデータを送信する前に、たとえば/admin/postsにアクセスしようとすると、私はreq.session.authenticatedをチェックします。定義されていない場合、私はログインページにリダイレクトします。

ログインページが簡単な検証の形式、およびサインインコントローラのメソッドがあります。ユーザーは、「適切なユーザー」と「右パスワード」を送信した場合、私はセッション変数を設定して、彼は認証されています。

私が難しいと感じるのは、実際には/ admin/*パスの呼び出しの前に、認証チェックのコードを"フィルター"にする方法です。

これは "ミドルウェア"の明示関数と関係がありますか?

ありがとうございました

答えて

59

まあ、ミドルウェアはまさにあなたが望むものです。ミドルウェア機能は、他のExpressルートハンドラと同じように機能する単なる機能であり、実際のルートハンドラの前に実行されます。あなた、例えば、このような何かを行うことができます:

function requireLogin(req, res, next) { 
    if (req.session.loggedIn) { 
    next(); // allow the next route to run 
    } else { 
    // require the user to log in 
    res.redirect("/login"); // or render a form, etc. 
    } 
} 

// Automatically apply the `requireLogin` middleware to all 
// routes starting with `/admin` 
app.all("/admin/*", requireLogin, function(req, res, next) { 
    next(); // if the middleware allowed us to get here, 
      // just move on to the next route handler 
}); 

app.get("/admin/posts", function(req, res) { 
    // if we got here, the `app.all` call above has already 
    // ensured that the user is logged in 
}); 

あなたが代わりに/admin/*app.allコールを使用しての、あなたが保護したいルートのへのミドルウェアとしてrequireLoginを指定し、それをやってできました私がここに示す方法は、あなたが誤ってそれを/adminで始まるページに追加することを忘れることができないようにします。ブランドン同様

+1

うわー....だからStackOverflowがうまくいきます。 :D eheheありがとう、それはちょうど私が期待した答えのようなものです。私は午後に試して、すべての作品がうまくいくならあなたの素晴らしい答えを受け入れます。 THX again –

+0

喜んで助けてください!この問題についてさらにご不明な点がありましたらお知らせください。^_^ –

+0

トークンを使用することの違いは何ですか? –

1

ていますが、より簡単なアプローチはApp.jsファイルに次のコードを追加することですconnectルート

app.use('/admin', requireLogin) 
app.use(app.router) 

app.get('/admin/posts', /* middleware */) 
+3

どういう意味ですか? : - \ –

1

を行くことができます。

var auth = function(req, res, next) { 

    if(isAdmin) { 

     return next(); 

    } else { 

     return res.status(400) 

    } 
}; 

app.use('/admin', auth, apiDecrement); 

ミドルウェアがルートにアタッチされています。 ExpressJSが進む前に、2番目のパラメータとして渡した関数を実行します。

は、このソリューションを使用すると、エンドユーザーにサイトを表示する前に別のチェックを行うことができます。

ベスト。

関連する問題