限制对所有路线的访问权限

我开始尝试使用ExpressJS + AngularJS,我遇到了一个压力的情况。

我的目标是拥有一个login页面和一个仪表板页面,并使用Passport + MongoDB我将对用户进行身份validation,如果凭据正确,则将其redirect到仪表板页面。

我已经开始使用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); }; 

除了我可以直接访问仪表板的部分(根本不login)之外,login系统工作正常。

所以我想我需要弄清楚在授予用户访问仪表板(或任何其他方面)之前,用户是否已通过身份validation。

我发现这是诀窍:

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

我会在每一个GET的部分调用它

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

这里最大的问题是,login视图也是一个局部的,我不希望当这是请求的视图ensureAuthenticated运行。

当前调用ensureAuthenticated每个部分请求的ensureAuthenticated崩溃任何浏览器,没有任何错误。

我到目前为止所尝试的(并没有工作):

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

也尝试调用login视图与自己的app.GET而不是使用ensureAuthenticated但不知何故Angular翻转,甚至不加载。

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

提前致谢。

目前还不清楚第一个(未经修改的) ensureAuthenticated版本是否ensureAuthenticated您的浏览器崩溃,或者是最后一个版本(您在ensureAuthenticated检查/partials/login ),尽pipe不pipe怎样,都不应该发生(如果“崩溃”意思是“摊位”,这是一个明确的expression不回复的回应)

但是作为一种替代方法,试试这个:

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

您的routes.partials必须显式检查是否要求login路由,因为在这种情况下, name参数将不会存在于req.params

只是为了确保:你是否还有一个用于/login的服务器端处理程序? 否则, res.redirect('/login')将不起作用。

我不认为服务器端在XHR请求redirect是一个很好的做法。 如果用户没有被授权,XHR请求应该返回401,并且客户端(Angular)应该采取行动显示通知消息并且redirect用户到login部分。 看看这个项目来处理这样的请求。 有演示和博客文章 。