2014-01-24 90 views
17

我有一個基於護照的基於快遞的項目,需要進行身份驗證。如何使用護照快遞保護靜態文件夾

該後臺是一個angularjs應用程序作爲靜態文件。

我的驗證碼是完全地基於https://github.com/jaredhanson/passport-local/blob/master/examples/express3-no-connect-flash/app.js

要不要服務於應用程序的角度,如果你沒有通過認證。我嘗試在/ admin路由上添加ensureAuthenticated,但它使路由無法工作(404)。一旦我刪除ensureAuthenticated /管理服務。

app.use(express.static(path.join(__dirname, 'public'))); 
app.use('/admin', ensureAuthenticated, express.static(path.join(__dirname, 'admin'))); 
//serve routes 
app.use(app.router); 

公用文件夾包含登錄頁面。

我怎麼能做到這一點?

+1

你能使用的中間件(連接)重定向到登錄,如果他們沒有登錄時點擊'/ admin'路由? – MikeSmithDev

+1

這就是我想要做的,但沒有成功。如果不是,請確保身份驗證重定向登錄。但是,有了這個,它沒有登錄時,但登錄時,我有一個404 /管理 – toutpt

+1

我想更多的'app.use(功能(REQ,RES,下一個){如果(!REQ.user))。 ..}' – MikeSmithDev

回答

15

可以使用中間件檢查路由和重定向他們,如果他們還沒有登錄,並且打的管理頁面,像(未經測試):

app.use(function(req, res, next) { 
    if (req.user == null && req.path.indexOf('/admin') === 0) 
    { 
     res.redirect('/login'); 
    } 
    next(); 
}); 
+2

這不適用於我。當一個文件夾處於靜態路徑時,它似乎不會通過app.use路徑 –

+0

如果您在其他'app.use'下面添加'static',您的答案對於像我這樣的新手來說會更清晰,部分(由'next()'調用),就像[here](https://stackoverflow.com/a/36446697/382515)。我在同一時間學習快遞,護照,承諾等。無論如何,謝謝 –

3
app.use('/admin', function(req,res,next){ 
if(req.user){ 
    return express.static(path.join(__dirname, 'public')); 
} else { 
    res.render(403, 'login', {message:'Please, login!'}); 
} 
}); 

//serve routes 
app.use(app.router); 
+1

答案看起來很合理,但是爲什麼它會起作用的解釋會有所幫助。 –

+0

e'/ admin'我們裝載中間件,由匿名函數定義,返回靜態中間件,如果用戶對象存在於請求對象中,或者通過呈現403頁面並以登錄形式停止請求處理。 – vodolaz095

+5

沒有爲我工作,請求只是沒有迴應!另外app.use(app.router);在express 4.x中被刪除 – Bobz79

19

陶然成同一個問題,這是我最終做了什麼!

app.use不允許您以這種方式鏈接中間件。各種各樣的 app.VERB函數可以,但app.use不會。這是一次爲一箇中間件 。

如果拆分的2箇中間件分成不同的通話,你應該得到 結果你想要的:

app.use('/admin', ensureAuthenticated); 
app.use('/admin', express.static(path.join(__dirname, 'admin'))); 

Cannot use basic authentication while serving static files using express

+1

從上面的源代碼可以看出:@Mathias編寫和編輯 - 從express版本4.x開始,您可以將多箇中間件作爲數組或兩者混合使用到app.use中。現在,使靜態文件授權安全: –