我开始尝试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')
将无法正常工作。