2017-03-01 14 views
0

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 

ありがとうございます。

+0

私はあなたの懸念を理解していないではないにも関わらず動作します。コメントの中で述べているように、データベースのパスワードは設定のものと一致するように設計されているため、パスワードを使用していません。このバックエンドで権限のないユーザーが認証される「攻撃」を記述すると、より明確になる可能性があります。 –

+0

それはデータベースのパスワードではなく、私はあなたがデータベースuser1、user2に2人のユーザーを持っていると見ました。 user1のパスワードはpassword1、user2のパスワードはpassword2です。 user:user1とpassword:password2をauthenticate関数に渡したとします。このコードを読むと、私はuser2のパスワードを与えてもuser1として私を認証します – xec86

+0

少なくともこのバックエンドに関する限り、パスワードはデータベースにありません。他のバックエンドがそのフィールドに値を設定することを決定した場合、これはこのフィールドとは無関係です。これは、設定で指定されたパスワードと一致するものを探します。 user1のユーザー名とuser2のパスワードを設定ファイルに入れることにした場合は、求めた結果が得られます。 –

答えて

0

authenticate()機能は、一連の資格情報を検証するために、あなたがlogin()

を使用してセッションを添付するユーザー

使用(認証)を返します。 のデフォルトのケースではキーワード引数、ユーザ名とパスワードとして の資格情報が必要で、各認証バックエンドに対してチェックします。 は、資格情報がバックエンドに有効な場合はUserオブジェクトを返します。 資格情報がどのバックエンドのために有効でないか、バックエンドが PermissionDeniedを発生させた場合、それは次の認証バックエンドのユーザー名とパスワードの場合はいずれも:

を返さない場合は、それに渡されます。

  • パスワードはDjango設定で設定されたものと比較され、ユーザオブジェクト はデータベースから照会されます。
  • そのユーザー名を持つユーザーが存在しない場合、バックエンドは新規ユーザーを作成します。

このバックエンドは、セキュリティの面から、それは最高の1 :)