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
謝謝。
我不明白你的問題。正如它在評論中所說的那樣,它根本不使用來自數據庫的密碼,因爲它只是用來匹配設置中的密碼。如果你在這個後端描述一個「攻擊」可能會更清楚,這將允許未經授權的用戶進行身份驗證。 –
對它的數據庫沒有密碼我看到,但是,假設你在數據庫user1,user2中有2個用戶。 user1的密碼是password1,而user2的密碼是password2。假設我將user:user1和password:password2傳遞給了authenticate函數。正如這段代碼所說,這將認證我爲user1,即使我給了user2的密碼 – xec86
數據庫中沒有密碼 - 至少就後端而言。如果其他後端決定填充該字段,則與此無關。所有這些都是使用設置中指定的密碼進行匹配。如果您決定將user1的用戶名和user2的密碼放在設置文件中,那麼您將得到您要求的結果。 –