我开始尝试使用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会以某种方式关闭,甚至无法加载。
有关如何解决此问题的任何想法?
提前致谢。
答案 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以处理此类请求。有demo和blog post。