2016-01-08 38 views
0

我構建了這個內部網絡應用程序(構建於Flask上並與Gunicorn一起使用),並且從未存儲過任何類型的用戶數據或會話數據,並且工作良好。現在我添加了一個認證頁面,使用我的組織的LDAP用戶輸入用戶名和密碼(它們用於登錄其計算機的用戶名和密碼),應用程序在LDAP服務器上驗證憑證,並在所有內容匹配時通知用戶。網絡應用程序顯然混淆了身份驗證憑證

當我只用一個進程提供應用程序(gunicorn -w 1)時,它工作正常。但是當我使用多個進程爲應用程序提供服務時,我的行爲就會不穩定即使用戶名和密碼正確,有時身份驗證也會失敗。有時候,如果一個用戶進行認證,那麼其他人將被視爲認證。有時用戶會認證並使用該應用一段時間,但隨後會點擊某些內容並被重定向到登錄頁面(所有功能都會進行裝飾以檢查用戶是否已通過身份驗證)。

我的猜測是我無法正確隔離用戶 - 用戶X輸入正確的用戶名和密碼,但當點擊「提交」時,應用程序認爲用戶Y沒有通過身份驗證,因此拒絕訪問(這裏是認證的邏輯:我檢查flask.session是否有密鑰user;如果有,用戶通過;否則,用戶被重定向到登錄頁面,如果認證成功,我將用戶名存儲在flask.session["user"])。

我該如何調試?如果我的猜測是正確的,那麼我怎樣才能確保用戶的憑據不會混淆?

+0

你提到它對一個進程工作正常,並且「即使用戶名和密碼正確,有時認證失敗」。不同的流程是否可以連接到同一個數據庫? –

+0

是的,同一個數據庫。 – Parzival

+0

是否有可能在全局對象上設置會話信息?如果您在本地運行,如果您使用一個用戶登錄,然後切換瀏覽器會發生什麼?你還在認證嗎? –

回答

0

我注意到session對象沒有持久(沒有明顯的原因,它一直變空)。我搜索了一下,發現這個answer。原來我的應用程序的密鑰不應該是隨機的(它是os.urandom(24)),它應該是一個常量字符串。一旦我確定身份驗證正常工作。