2013-04-11 56 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