1

我开始尝试使用 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 会关闭,甚至不加载。

关于如何解决这个问题的任何想法?

提前致谢。

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 回答