Djangoのドキュメントがcontrib.auth.models.Usersのauthenticateメソッドのオーバーライドをどのように概説しているか理解できません。 hereの下のコードによれば、指定されたプライマリキーフィールド(username、emailなど)のパスワードと一致するかどうかにかかわらず、メソッドに有効なユーザー名とデータベース内の任意の場所に存在する有効なハッシュが渡された場合、authenticateメソッドは成功しません。 ...) か否か。 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関数に渡したとします。このコードを読むと、私はuser2のパスワードを与えてもuser1として私を認証します – xec86
少なくともこのバックエンドに関する限り、パスワードはデータベースにありません。他のバックエンドがそのフィールドに値を設定することを決定した場合、これはこのフィールドとは無関係です。これは、設定で指定されたパスワードと一致するものを探します。 user1のユーザー名とuser2のパスワードを設定ファイルに入れることにした場合は、求めた結果が得られます。 –