2013-04-11 42 views
1

我是使用Passport.js的新手,但我发现目前的情况还不错。我使用护照本地护照。要求使用Passport.js/Node.js进行目录(一页除外)的认证?

但是,我想要求整个目录不包括一个页面的身份验证。所以在我的节点服务器,我服了这种猪病像这样(使用快递):

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

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

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

然后我想需要休息认证,所以是这样的:

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') 
} 

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

回答

2

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

这就是说,试试这个:

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.html和发送回没有该路由处理程序),因此在ensureAuthenticated中间件中检查它。

+0

啊,这太棒了!谢谢!也帮助我理解这里发生了什么。 – streetlight 2013-04-11 21:51:38

1

我不知道它是否是你的回调。尝试:

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

感谢您的帮助!我还没有测试过你的解决方案,因为@robertklep首先发布了他的答案,这有效,所以我坚持了。尽管谢谢您的帮助! – streetlight 2013-04-11 21:52:33