備忘録です。
Djangoはデフォルトだとusername
とpassword
での認証となっているため、email
とpassword
で認証できるようにユーザーモデルをサクッと実装してみる。
1. accountsアプリを作成
まずは認証用のアプリ(accounts)を作成して、settings.pyに登録する。ここまでは、至って普通。
python manage.py startapp accounts
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'accounts',
]
2. カスタムユーザーとカスタムマネージャーの作成
ここからが本番。accountsのmodels.pyに定義していく。
django.contrib.auth.models.AbstractBaseUser
を継承したカスタムユーザーのクラスを作成し、必要なフィールド情報を記入する。このとき、PermissionsMixin
も一緒に継承する(☆1)。
パスワードのフィールドはAbstractBaseUser
に存在しているので定義する必要はない。PermissionsMixin
にスーパーユーザーかどうかを識別するis_superuser
というフィールドが入っているので、定義する必要はない。
USERNAME_FIELD = 'email'
とすることで、メールアドレスでこのテーブルのレコードを一意に識別することができる、つまり**メールアドレスでのログインが可能となる**(☆2)。
カスタムマネージャー(UserManager
)は、django.contrib.auth.models.BaseUserManager
を継承して作成し、create_user
と create_superuser
メソッドを追加して、ユーザ作成時、スーパーユーザー作成時の処理を追加する(☆3)。
from django.db import models
from django.contrib.auth.models import (
BaseUserManager, AbstractBaseUser, PermissionsMixin
)
class UserManager(BaseUserManager): # ☆3
def create_user(self, username, email, password=None):
if not email:
raise ValueError('Enter Email!')
user = self.model(
username=username,
email=email
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, username, email, password=None):
user = self.model(
username=username,
email=email,
)
user.set_password(password)
user.is_staff = True
user.is_active = True
user.is_superuser = True
user.save(using=self._db)
return user
class User(AbstractBaseUser, PermissionsMixin): # ☆1
# 使いたいFieldを追加
username = models.CharField(max_length=255)
email = models.EmailField(max_length=255, unique=True)
is_active = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
objects = UserManager()
USERNAME_FIELD = 'email' # ☆2 このテーブルのレコードを一意に識別
REQUIRED_FIELDS = ['username'] # スーパーユーザ作成時に入力する
class Meta:
db_table = 'users'
def __str__(self):
return self.email
3. settings.pyに追記
settings.pyに、カスタムユーザーモデルを以下のように追記する。
AUTH_USER_MODEL = 'accounts.User'
4. マイグレーション
$ python manage.py makemigrations accounts
$ python manage.py migrate
5. 管理者の作成
$ python manage.py createsuperuser
6. 管理サイトを開いて見る
こんな感じで、メールアドレスとパスワードでの認証システムを実装することができる。