29

NodeJSとExpressJS(MVC用)の最新バージョンを使用しています。

私は通常、残りのパスを次のように構成します。次に例を示します。

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

今、私は自分/admin/*のURLのセットを保護したいのです。つまり、単純な認証が必要なのです。それは単なるドラフトです。

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

ログインページには、簡単な検証フォームとサインインコントローラー方式があります。ユーザーが「適切なユーザー」と「適切なパスワード」を送信した場合、セッション変数を設定すると、ユーザーは認証されます。

私が難しいと思う、または理解できないのは、すべての/ admin / *パス呼び出しの前に、実際に「フィルター」コード、つまり認証チェックを行う方法です。

これは「ミドルウェア」エクスプレス機能と関係がありますか?

ありがとうございました

4

3 に答える 3

78

うん、ミドルウェアはまさにあなたが望むものです。ミドルウェア関数は、他の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
});

で呼び出しを使用する代わりに、保護するrequireLoginルートのミドルウェアとして指定することもできますが、ここで示す方法で指定すると、で始まるページに誤って追加することを忘れることができなくなります。app.all/admin/*/admin

于 2012-09-05T07:05:05.963 に答える
5

さらに簡単なアプローチは、App.jsファイルに次のコードを追加することです。

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

    if(isAdmin) {

        return next();

    } else {

        return res.status(400)

    }
};

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

ご覧のとおり、ミドルウェアがルートに接続されています。ExpressJSは先に進む前に、2番目のパラメーターとして渡した関数を実行します。

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

一番。

于 2015-09-08T10:14:52.047 に答える
1

connectブランドンのようですが、ルートに行くこともできます

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

app.get('/admin/posts', /* middleware */)
于 2012-09-05T08:58:09.557 に答える