2014-10-31 96 views
2

我正在使用Flask-Security來管理用戶,並且我得到的報告顯示用戶已成功登錄成爲自己,但隨機加載頁面時會顯示他們登錄爲完全不同的人。我不確定我要去哪裏錯。這可能發生什麼樣的可能性?用戶似乎以另一個用戶身份登錄

我用UserService來做一些簡單的用戶管理。我在每個請求之前實例化一個用戶服務並傳入current_user。

 

@app.before_request 
def load_request_services(): 
    g.user_service = UserService(user_datastore, application_service, email_service, ORGS, current_user) 

然後,我從這個方法得到UserService當前用戶:

 

def current_user_get_info(self): 
    return { 
     'user': self.current_user.email, 
     'first_name': self.current_user.first_name, 
     'last_name': self.current_user.last_name, 
     'phone_number': self.current_user.phone_number, 
} 

這個當執行該API請求代碼被稱爲:

 
    class CurrentUser(restful.Resource): 
    def get(self): 
     return json_response(g.user_service.current_user_get_info()) 
+1

你有沒有玩過這個會議? 'session [「userid」]'是Flask-Login/Security查找當前用戶的地方([source](https://github.com/maxcountryman/flask-login/blob/master/flask_login.py#L333-L347) ))。所以從這裏開始可能是值得的,然後按照你創建的代碼來找到你開始注意到奇怪的地方。 – Doobeh 2014-10-31 13:41:01

+0

我不玩弄會議。但是,我所做的一件事是設置remember_me = True,當我調用login_user並且從不強制重新登錄時。但是,當我進行更新時,我不時重新部署我的應用程序。這會搞砸會議嗎?如果用戶在重新部署後回到站點,所有會話都會清楚嗎?我會假設應用程序在某處存儲會話信息,並且在重新部署後大概會消失。但是,我注意到重新部署後我不必重新登錄。 – vik 2014-10-31 21:54:19

+0

'app.secret_key'用於簽名會話,因此如果在重新部署之間保持不變,則會話仍然有效。 – Doobeh 2014-10-31 23:33:52

回答

1

我發現這個問題,並我在這裏張貼給其他可能有同樣問題的人。

事實證明,正在訪問我的網站的用戶在一個帶有代理的VPN後面。代理緩存頁面以及用戶的Cookie。當一個用戶發出請求時,代理會將該頁面與該用戶的cookie緩存在標題中。在下一個用戶的請求中,代理將使用第一個用戶的cookie返回該頁面,因此第二個用戶會發現自己是其他人。

這裏看到更多的信息:https://code.google.com/p/doctype-mirror/wiki/ArticleHttpCaching

我解決它通過緩存控制HTTP標頭設置爲「私人」,使得代理不會嘗試緩存它。在燒瓶,它看起來像這樣:

@app.after_request 
def add_header(response): 
    response.cache_control.private = True 
    response.cache_control.public = False 
    return response 
相關問題