限制访问除一个之外的所有路由

时间:2013-06-13 18:41:15

标签: angularjs node.js authentication express passport.js

我开始尝试使用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会以某种方式关闭,甚至无法加载。

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

提前致谢。

2 个答案:

答案 0 :(得分: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')无效。

答案 1 :(得分:1)

我不认为服务器端重定向XHR请求是一个好习惯。如果用户未获得授权,则XHR请求应返回401,并且客户端(Angular)应将该操作视为显示通知消息并将用户重定向到登录部分。请查看this project以处理此类请求。有demoblog post