2017-03-01 51 views
0

我很難理解Django的文檔如何概述了contrib.auth.models.Users中的authenticate方法的重寫。根據here下面的代碼,如果方法傳遞了一個有效的用戶名和數據庫中任何位置存在的有效散列,而不管它是否與所提供的主鍵字段(用戶名,電子郵件等)的密碼相匹配,那麼認證方法是否成功...) 或不。有沒有check_password正在做的事情,我沒有看到像確保在密碼後面傳遞的字段被幕後檢查?因爲這個提供的例子似乎有缺陷。Django自定義後端文檔差異

# From Django 1.10 Documentation 
def authenticate(self, username=None, password=None): 
    login_valid = (settings.ADMIN_LOGIN == username) 
    pwd_valid = check_password(password, settings.ADMIN_PASSWORD) 
    if login_valid and pwd_valid: 
     try: 
      user = User.objects.get(username=username) 
     except User.DoesNotExist: 
      # Create a new user. There's no need to set a password 
      # because only the password from settings.py is checked. 
      user = User(username=username) 
      user.is_staff = True 
      user.is_superuser = True 
      user.save() 
     return user 
    return None 

謝謝。

+0

我不明白你的問題。正如它在評論中所說的那樣,它根本不使用來自數據庫的密碼,因爲它只是用來匹配設置中的密碼。如果你在這個後端描述一個「攻擊」可能會更清楚,這將允許未經授權的用戶進行身份驗證。 –

+0

對它的數據庫沒有密碼我看到,但是,假設你在數據庫user1,user2中有2個用戶。 user1的密碼是password1,而user2的密碼是password2。假設我將user:user1和password:password2傳遞給了authenticate函數。正如這段代碼所說,這將認證我爲user1,即使我給了user2的密碼 – xec86

+0

數據庫中沒有密碼 - 至少就後端而言。如果其他後端決定填充該字段,則與此無關。所有這些都是使用設置中指定的密碼進行匹配。如果您決定將user1的用戶名和user2的密碼放在設置文件中,那麼您將得到您要求的結果。 –

回答

0

authenticate()函數返回您使用login()

使用身份驗證()來驗證一組憑據連接會話的用戶。它將 憑證作爲關鍵字參數, 默認情況下的用戶名和密碼,並根據每個驗證後端進行檢查,如果憑證對後端有效,則返回一個User對象。如果 憑據不適用於任何後端或者後端提高 PermissionDenied,返回None:

在下面的認證後端的用戶名和密碼的情況下傳遞給它。

  • 將密碼與Django設置中的一組進行比較,並從數據庫中查詢用戶對象 。
  • 如果具有該用戶名的用戶不存在,則後端會創建新用戶。

這個後端工作,即使從安全性方面是不是最好的之一:)