我开始尝试ExpressJS + AngularJS,但遇到了压力。

我的目标是拥有一个登录页面和一个仪表板页面,然后使用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会关闭甚至不加载。

有关如何解决此问题的任何想法?

提前致谢。

最佳答案

我不清楚ensureAuthenticated的第一个(未修改)版本是否使您的浏览器崩溃,还是最后一个版本(您在其中检查/partials/login的版本)崩溃了,尽管无论如何,都不会发生(如果通过“崩溃”)您的意思是“ stalls”,这表示Express没有发回响应)

但是,也可以尝试以下方法:

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


您的routes.partials确实必须明确检查是否为登录路由调用了它,因为在这种情况下,name参数在req.params中将不存在。

只是为了确保:您是否还有/login的服务器端处理程序?否则res.redirect('/login')将无法正常工作。

10-07 14:08