NodeJSおよびExpressJS(MVC用)の最新バージョンを使用しています。
私は通常、次のように、残りのパスを構成します。
app.get('/archive', routes.archive);
/admin/*
の一連のURLを保護したいのですが、単純な認証が必要なだけで、ドラフトにすぎません。
ユーザーが/admin/posts
などにアクセスしようとすると、対応するビューとデータを送信する前に、req.session.authenticatedをチェックします。定義されていない場合は、ログインページにリダイレクトします。
ログインページには単純な検証フォームとサインインコントローラーメソッドがあります。ユーザーが「正しいユーザー」と「正しいパスワード」を送信した場合、セッション変数を設定して認証されます。
私が難しいと思う、または理解できないのは、実際に"filter"コードを作成する方法です。つまり、すべての/ admin/*パスを呼び出す前に、認証チェックを行います。
これは「ミドルウェア」エクスプレス機能と関係がありますか?
ありがとうございました
はい、ミドルウェアはまさにあなたが欲しいものです。ミドルウェア関数は、実際のルートハンドラーの前に実行されることを除けば、他の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
});
app.all
を/admin/*
で呼び出す代わりに、保護するルートのeachへのミドルウェアとしてrequireLogin
を指定できますが、ここに示す方法により、/admin
で始まるページに誤って追加するのを忘れることがありません。
さらに簡単な方法は、App.jsファイルに次のコードを追加することです。
var auth = function(req, res, next) {
if(isAdmin) {
return next();
} else {
return res.status(400)
}
};
app.use('/admin', auth, apiDecrement);
ご覧のとおり、ミドルウェアがルートにアタッチされています。 ExpressJSが進む前に、2番目のパラメーターとして渡した関数を実行します。
このソリューションを使用すると、エンドユーザーにサイトを表示する前に、さまざまなチェックを行うことができます。
ベスト。
ブランドンのようですが、connect
ルートに行くこともできます
app.use('/admin', requireLogin)
app.use(app.router)
app.get('/admin/posts', /* middleware */)