1

ExpressJS + AngularJS の実験を始めていますが、ストレスの多い状況に遭遇しました。

私の目標は、1 つのログイン ページと 1 つのダッシュボード ページを用意することです。Passport + MongoDB を使用してユーザーを認証し、資格情報が正しい場合は、ダッシュボード ページにリダイレクトします。

angular-express-seedから始めて修正したので、前述のビューになりました。

$routeProvider.
    when('/login', {
      templateUrl: 'partials/login',
      controller: 'LoginCtrl'
    }).
    when('/dashboard', {
      templateUrl: 'partials/dashboard',
      controller: 'DashboardCtrl'
    }).
    otherwise({
      redirectTo: '/login'
    });

私は各部分ビューを次のように提供しています:

app.get('/partials/:name', routes.partials);


exports.partials = function (req, res) {
  var name = req.params.name;
  res.render('partials/' + name);
};

ログイン システムは、ダッシュボードに直接アクセスできる部分を除いて (まったくログインせずに) 正しく機能しています。

そのため、ダッシュボード (またはその他の領域) へのアクセスを許可する前に、ユーザーが認証されているかどうかを確認する必要があると思います。

トリックを行うこれを見つけました:

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

GETそして、私はそれを部分的に呼び出します

app.get('/partials/:name', ensureAuthenticated, routes.partials);

ensureAuthenticatedここでの大きな問題は、ログイン ビューも部分的であり、それが要求されているビューであるときに実行したくないことです。

現在、部分的なリクエストごとに呼び出すとensureAuthenticated、ブラウザがクラッシュしますが、エラーは発生しません。

私がこれまでに試したこと(そしてうまくいかなかった):

function ensureAuthenticated(req, res, next) {
      if ( req.route.params.name !== 'login' && req.isAuthenticated() ) { return next(); }
      res.redirect('/login');
    }

app.GETまた、使用せずに独自のログインビューを呼び出してみましensureAuthenticatedたが、どういうわけかAngularがオフになり、ロードすらしません。

これを解決する方法についてのアイデアはありますか?

前もって感謝します。

4

2 に答える 2

1

の最初の(変更されていない)バージョンがensureAuthenticatedブラウザをクラッシュさせるのか、それとも最後のバージョン( をチェックする/partials/login)がクラッシュするのかは私にはわかりませんが、何があっても起こらないはずです(「クラッシュ」が「ストール」を意味する場合、これは、Express が応答を返さないことを示す兆候です)。

しかし、代替手段として、これを試してください:

app.get('/partials/login', routes.partials);
app.get('/partials/:name', ensureAuthenticated, routes.partials);

ログインroutes.partialsルートに対して呼び出されたかどうかを明示的に確認する必要があります。その場合、nameパラメータは に存在しないためですreq.params

念のために言っておきますが、サーバー側のハンドラー/loginもありますか? それ以外の場合res.redirect('/login')は機能しません。

于 2013-06-13T20:32:54.107 に答える
1

XHR リクエストでのサーバー側のリダイレクトは良い方法だとは思いません。ユーザーが承認されていない場合、XHR リクエストは 401 を返す必要があり、クライアント側 (Angular) は、通知メッセージを表示し、ユーザーをログイン パーシャルにリダイレクトするアクションを実行する必要があります。このようなリクエストの処理については、このプロジェクトを参照してください。デモブログ投稿があります。

于 2013-06-14T16:20:10.830 に答える