2015-05-07 61 views
0

假設用戶登錄Django站點。django如何知道http請求已通過身份驗證?

對於後續請求,django知道它是同一個用戶。 它是如何知道的?

用戶(瀏覽器)是否發送某種類型的ID? 如果是這樣,什麼阻止惡意用戶可以嘗試隨機ID登錄爲用戶?

我試圖將此應用程序轉換爲使用django。
應用程序給用戶標識賦予一個標記(某種id),並且用戶將其附加到http-header以用於所有後續請求。

如果我將應用程序轉換爲與django對話,我是否做了基本相同的事情?

編輯

我想要一個外行的解釋,並試圖讓一個自己。

當用戶登錄時,服務器生成一個id(django世界中的session_key)。 服務器可以通過此ID來識別用戶。

服務器通過cookie的形式給出了這樣的ID給客戶端(response.set_cookie(cookie_name, id)

客戶端發送這個cookie在服務器上作爲cookie每個請求。
(我猜程序員不需要做任何事情來發送cookie到服務器)

Cookie在django服務器設置的某個將來到期。
(是否有可能防止過期?)

所以Django的基本上是做同樣的事情,我的問題描述(不同的是一個是餅乾,一個是HTTP頭),並有描述我同樣的問題猜測?

回答

0

你有沒有聽說過「餅乾」? ;)

也搜索Django的裝飾@login_required

0

輸入我的朋友的會話世界。

默認情況下,django通過使用基於cookie的會話將特定客戶端與用戶相關聯來實現其魔力。

用戶既可以是匿名用戶,也可以是隻有很少已知信息的訪問者,也可以是系統使用後端進行身份驗證的經過身份驗證的用戶。

更具體地說,django.contrib.auth應用程序處理用戶身份驗證,並且必須在您安裝的應用程序上啓用它才能擁有不同的不同用戶。

它的功能是,當您第一次登錄時,它會通過在會話密鑰中添加一些變量來驗證客戶端是否爲特定的已知用戶,然後對其進行重新加密。然後該會話字符串包含有關當前用戶的信息,然後默認將其存儲到數據庫中。

對於後續請求它使用django.contrib.auth.middleware.SessionAuthenticationMiddleware中間件,以驗證與所述會話密鑰的請求屬於從後端存儲公知的會話密鑰。如果不是,它只是以匿名憑證作爲客戶端返回響應。

重要的是要認識到會話密鑰存儲在您可以檢查的瀏覽器cookie中。

因此,當您以登錄用戶身份訪問配置文件頁面(例如http://example.com/user/1)時,應用程序使用關鍵字參數與數字1來獲取與該數字關聯的用戶。

user = User.objects.get(pk=1) 
if request.user == user: 
# Show your own user profile page 
else: 
# user is not the owner of the profile show public profile 

這樣你就可以區分請求。

相關問題