2017-12-15 8 views
0

ユーザ名の代わりにメールアドレスでユーザを認証するカスタムバックエンドを作成しています。あなたが見ることができるように、私は、また、主キーを電子メールフィールドは一意に、とき、バックエンドの各ユーザのDjangoユーザオブジェクトの作成

class User(AbstractUser): 
    email = models.EmailField(
     _('email address'), 
     max_length=150, 
     unique=True, 
     primary_key=True, 
     help_text=_('Required. 150 characters of fewer. Must be a valid email address.'), 
     error_messages={ 
      'unique':_("A user with that email address already exists."), 
     }, 
    ) 

:私はすでにAbstractUserから継承したカスタム・ユーザー・モデルを書きました。

私はバックエンドの書き方についてはドキュメントを以下のよ、と私はこれを読んだ:

Djangoの管理者が緊密にDjangoのユーザオブジェクトに接続されています。 これに対処する最良の方法は、バックエンド用に存在する ユーザごとにDjango Userオブジェクトを作成することです(LDAPディレクトリ、 外部SQLデータベースなど)。これを行うスクリプトを書くか事前に 、またはあなたのauthenticateメソッドは ユーザーがログインにそれを最初に行うことができます。

それは私が、私は推測しているDjangoのUserオブジェクトを(デフォルトのユーザーオブジェクトdjango.contribがされて作成する必要があることを述べています.auth.models.User)の各ユーザーのために。

質問1:バックエンドがget_user(user_id)authenticate(request, **credentials)(これはdocsに記載されています)を実装するクラスである場合、バックエンドにはどのようにユーザーが含まれますか?私のバックエンドにあるユーザーの意味はですか?

質問2:cutsomユーザオブジェクトがサブクラスAbstractUserの場合、実際には通常のDjango Userオブジェクトを作成する必要がありますか?彼らはdjango.contrib.auth.models.Userとほとんど同じですが、email-fieldが主キーでユニークである点が異なります。

+1

モデル全体ではなくカスタム認証バックエンドだけが必要です。 https://stackoverflow.com/a/37332393/7654934を参照してください。 –

+1

'email'フィールドは、ログインに使用したい場合は間違いなくユニークであるべきですが、' primary_key'として再考することをお勧めします。これにより、ユーザーが電子メールアドレスを変更するのは難しい場合があります。 – Alasdair

+1

デフォルトの認証バックエンドは、 'USERNAME_FIELD = 'email''を持つカスタムユーザモデルをサポートしています。私はそれを行い、カスタム認証バックエンドは必要ありません。 – Alasdair

答えて

2

カスタムモデル用にUSERNAME_FIELD = 'email'がある場合は、カスタム認証バックエンドを作成する必要はありません。デフォルトのModelBackendは電子メールによるログインを処理します。

バックエンドのユーザーについてDjangoが話す場合、DjangoはLDAPディレクトリまたはこれらを使用する外部データベースを意味し、これらにアクセスするのはbackend classではありません。カスタムユーザーモデルをお持ちの場合は、get_userモデルで返されます。Userモデルではありません。しかし、私がすでに言ったように、あなた自身の認証バックエンドを書くことは実際には必要ないように思えます。

関連する問題