2017-03-06 37 views
1

我在MEAN項目中一直使用express-sessionshttps://www.npmjs.com/package/express-sessions)以及angular-route來管理用戶登錄/認證。一旦用戶登錄或註冊,他們的用戶數據(例如整個User)被分配給一個會話,然後用戶被重定向到一個新頁面:#!/dashboard使用快速會話在MEAN應用程序中檢查有效會話的最佳方法是什麼?

爲了防止用戶訪問#!/dashboard,而無需先註冊或登錄,我做一個快速的「會話確認」,我把它從我的角度控制器,它傳遞給角工廠,迅速地ping服務器 - 將端來檢查會話對象。

如果會話存在,我返回一個布爾值true,如果會話不存在,我發送一個布爾型false。然後我做了一個條件聲明:如果是,繼續並在#!/dashboard頁面(用戶的會話有效)繼續抓取帖子或用戶數據等。如果爲false,則重定向到登錄頁面存在的/(防止用戶訪問#!/dashboard)。

這實現了我的目標,即防止用戶在瀏覽器中輸入/#!/dashboard而未登錄/註冊,但這看起來像是一個昂貴的解決方案,並不是很乾淨。

有沒有一種更清潔或更好的方式來執行此「會話檢查」,以防止在沒有有效登錄會話的情況下訪問我的後端頁面?

我已經使用了快遞中間件,也許有一種方法可以快速檢查每個請求嗎?

有沒有人有任何關於如何改善我的會話檢查的建議?

+1

如果我沒有錯,你正在做客戶端(角)的會話檢查。這是一個巨大的安全災難,等待發生,如果沒有很好地實施。 – Iceman

+0

您的應用程序是否完全單獨分頁應用程序 –

+0

@Iceman也許這是一個很大的安全問題 - 我仍在學習 - 更多信息:我檢查會話的方式是創建服務器路由,轉到後端,檢查在req對象中是否存在會話,如果是,則返回true,否則返回false(作爲變量「validSession」)。然後我在回調函數中有一條簡單的行,它在我的角度工廠中運行,一旦收到後端的響應:'if(!validSession){$ location.url('/'); };所以,如果會話無效,它會重定向到'/'頁面。你的方法看起來好多了,但是這種描述方式不安全? – natureminded

回答

1
function secure_pass(req, res, next) { 
    if (req.session.loggedIn || req.path==='/login') { 
     next(); 
    } else { 
     res.redirect("/login"); 
    } 
} 

此功能需要照顧,如果session.loggedIn未設置爲true,那麼則該用戶被重定向到/login

現在注入它作爲一箇中間件:

app.use(secure_pass); 

現在上面的行之後的任何app.get("/", myfunc);現在將「安全」通過你的secure_pass功能。

Ofcourse,你可以有選擇地注入了某些航線中間件只是以及代替所有的:

app.get("/", secure_pass, myfunc); 

注:以上是未經測試的代碼。我只是把它放在一起,給你一個方法的想法。

+0

今天晚些時候我會在這裏檢查一下,並且玩耍。我非常感謝這個例子。一旦我弄髒了手,我會盡快回復你。 – natureminded

+0

+1爲了您的幫助和選擇性注射,非常方便。我能夠創建一個函數並注入它,但是,當我運行'res.redirect('/');'如果我的會話不存在,我實際上收到我的客戶端控制檯中的整個html文件,而不是體驗頁面重定向。我相信這是因爲我正在使用'angular-route',並且partials系統正在干擾。 (這就是爲什麼我選擇使用'$ location'來處理我的頁面重定向,而不是'res.redirect')。你有什麼想法,當'angular-routes'(partials)被設置時,'res.redirect'仍然是可能的嗎? – natureminded

+0

以下是我用於partials的內容:https://www.npmjs.com/package/angular-route – natureminded

1

如果您在前端使用AngularJS 2,那麼可以使用guards的概念來保​​護您的路由免受未經授權的訪問,但這隻能處理您的應用程序的角色部分;您還需要通過護照等模塊來保護您的快速應用。您也可以考慮令牌認證,而不是使用passportjwt的會話。我寫了兩篇關於如何從backfront結束使用護照和jwt驗證您的平均應用的文章。

+0

爲了進一步研究,我昨晚做了一些閱讀,表明JSON Web Tokens更適合單頁面應用。我會閱讀你的文章,玩這個主題的其他解決方案,並回復給你。謝謝! – natureminded

+0

你有沒有使用'jsonwebtoken'(https://jwt.io)?看起來我可以獨自使用智威湯遜(沒有護照),不是嗎? (我希望用護照進行練習,但只是試圖爲這個特定的項目尋找更爲簡單的骨骼解決方案)。我已經爲您的文章添加了書籤,以後我會深入到護照中。 +1謝謝你的資源,看起來非常詳細,很好的例子。 – natureminded

+1

護照在這種情況下只驗證你的用戶說一個用戶名和密碼;如果你願意的話,你可能會做到這一點。 express-jwt-token是在您的快速應用程序中使用jwt.io的模塊,否則您需要自己在快速應用程序中實現庫jwt.io。 – elha

相關問題