要求Passport.js / Node.js目录(除了一个页面)的身份validation?

我是使用Passport.js的新手,但是我发现目前为止还不错。 我使用护照本地护照。

但是,我想要求整个目录不包括一个页面的身份validation。 所以在我的节点服务器中,我正在像这样使用这个direcory(使用express):

app.use("/admin", express.static(__dirname + "/admin")); 

然后我想让用户打到/admin/login.html,所以我想要做这样的事情:

 app.get('/gb-admin/login.html', function(req, res){ }); 

然后,我想要求其余的authentication,所以这样的事情:

 app.get('/gb-admin/*', ensureAuthenticated, function(req, res){}); 

这是我的ensureAuthenticated函数,以供参考,如果有帮助:

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

我怎么去做这个? 我一直在发送无限循环的东西,导致浏览器超时。 谁能帮忙?

你得到超时的原因是因为你不能有一个空的路由处理程序; 有一次,你必须返回一个响应,或者把请求通过下一个路由处理器/中间件。

这就是说,试试这个:

 function ensureAuthenticated(req, res, next) { if (req.path === '/gb-admin/login.html' || req.isAuthenticated()) { return next(); } res.redirect('/gb-admin/login.html') } app.get('/gb-admin/*', ensureAuthenticated, function(req, res, next) { next(); }); // the static middleware needs to be declared after the route above, otherwise // it will take precedence and ensureAuthenticated will never be called. app.use("/gb-admin", express.static(__dirname + "/admin")); 

我不认为有一种方法可以使用单独的login页面path(除非实际上实现了读取login.html并将其从没有该路由处理程序的地方发回),因此请在ensureAuthenticated中间件中进行检查。

我不知道这是你的callback。 尝试:

 app.get('/gb-admin/*', function (req, res, next) { ensureAuthentication(req, res, next) { if (req.isAuthenticated()) { return next(); } res.redirect('/gb-admin/login.html') }); });