【Django】カスタムユーザーを作成して認証する全手順解説
Djangoを使ったウェブアプリケーションの開発は、その柔軟性から多くの開発者に人気です。今回は、カスタムユーザーを作成し、ユーザー登録やプロフィール管理機能を実装する方法を詳しく解説します。カスタムユーザーモデルの重要性を理解し、Djangoアプリをセットアップすることで、実践的なスキルを身につけます。さらに、セキュリティ面にも配慮したログイン機能や、ユーザーが自分のプロフィールを管理できる機能を実装します。このチュートリアルを通じて、Djangoの魅力を最大限に引き出し、ユニークなユーザー管理機能を持つアプリケーションを作成する第一歩を踏み出しましょう!
目次
チュートリアルの全体像
第2章: カスタムユーザー作成と認証導入 (now🐾)
カスタムユーザーとは
カスタムユーザーは、Djangoの標準ユーザーモデル(User
モデル)を拡張または変更したユーザー管理のためのモデルです。デフォルトのユーザーモデルには、基本的な認証機能が備わっていますが、特定のプロジェクトやアプリケーションの要件に応じて、より柔軟なユーザー管理が必要になることがあります。
標準ユーザーモデルとその制約
Djangoの標準ユーザーモデルには以下のような特徴と制約があります。
フィールドの制限: 標準モデルには、username
、email
、first_name
、last_name
、password
などの基本フィールドがありますが、これらを変更したり、追加したりすることはできません。
ユーザー名の必須性: デフォルトではusername
フィールドが必須ですが、他のプロジェクトではメールアドレスをユーザー識別子として使用したい場合もあります。
拡張性の欠如: 特定のビジネスロジックや機能に必要なフィールド(例: ユーザーの役割、プロフィール情報など)を追加するのが難しいです。
カスタムユーザーを使用する理由
カスタムユーザーを使用する理由は以下の通りです。
要件に応じた柔軟性: プロジェクトのニーズに応じて、フィールドを自由に追加・変更できるため、特定のビジネスロジックを実装しやすくなります。
ユーザー識別子の変更: username
ではなくemail
を主な識別子として使用するなど、ユーザー認証の方法をカスタマイズできます。
複雑なロール管理: ユーザーの役割や権限を簡単に管理できるように、関連するフィールドを追加できます。
拡張性の確保: 将来的な機能追加や変更に対しても、柔軟に対応できる設計にできます。
データベースの整合性: 最初からカスタムユーザーモデルを使うことで、データベースのスキーマを整合性のあるものに保つことができます。
このように、カスタムユーザーを利用することで、Djangoアプリケーションの認証機能をより具体的な要件に合った形で実装できます。
認証用アプリ作成
まず、Djangoプロジェクト内に新しいアプリケーションを作成します。このアプリはユーザー管理に特化したもので、accounts
という名前にします。
python manage.py startapp accounts
アプリ登録
作成したアプリをDjangoプロジェクトに登録します。これにより、Djangoはこのアプリを認識し、マイグレーションや管理サイトなどで利用できるようになります。settings.py
のINSTALLED_APPS
リストに以下を追加します。
INSTALLED_APPS = [
# ...
'accounts.apps.AccountsConfig',
]
カスタムユーザ定義
次に、accounts/models.py
でカスタムユーザーモデルを定義します。ここでは、ユーザーの基本情報(username
やemail
)に加えて、必要なフィールドやメソッドを追加しています。
accounts/model.py
from django.contrib.auth.models import (
AbstractBaseUser,
BaseUserManager,
PermissionsMixin,
)
from django.db import models
class UserManager(BaseUserManager):
def create_user(self, username, email, password=None, **extra_fields):
email = self.normalize_email(email)
user = self.model(username=username, email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, username, email, password=None, **extra_fields):
extra_fields.setdefault("is_staff", True)
extra_fields.setdefault("is_superuser", True)
return self.create_user(username, email, password, **extra_fields)
class User(AbstractBaseUser, PermissionsMixin):
username = models.CharField(unique=True, max_length=255)
email = models.EmailField(unique=True)
description = models.CharField(max_length=255, blank=True, default="")
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
objects = UserManager()
USERNAME_FIELD = "email"
REQUIRED_FIELDS = ["username"]
UserManager: ユーザー作成やスーパーユーザー作成のためのメソッドを提供します。
User: ユーザー情報を保持するモデルです。USERNAME_FIELD
としてemail
を指定し、メールアドレスでの認証を可能にしています。
カスタムユーザーを認証モデルとして登録
Djangoにカスタムユーザーモデルを認識させるために、settings.py
に以下の設定を追加します。
AUTH_USER_MODEL = "accounts.User"
マイグレーション
モデルをデータベースに反映させるためにマイグレーションを行います。これにより、ユーザーテーブルが作成されます。
python manage.py makemigrations
マイグレーション実行
python manage.py migrate
認証用のユーザテーブルが作成できました。
カスタムユーザーを管理画面に登録
管理画面にアクセスするためのスーパーユーザーを作成します。以下のコマンドを実行し、プロンプトに従ってユーザー情報を入力します。
python manage.py createsuperuser
ユーザ名、メールアドレス、パスワードを聞かれるので、入力していくと作成できます。
http://localhost:8000/admin
にアクセスして、ログインします。
ログイン画面
管理画面
ここに、作成したカスタムユーザーを管理する機能を追加します。
Djangoの管理画面にカスタムユーザーを登録するため、accounts/admin.py
にカスタム管理クラスを作成します。
accounts/admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User
class CustomUserAdmin(UserAdmin):
list_display = (
"username",
"email",
"is_staff",
"is_active",
)
search_fields = ("username", "email")
ordering = ("email",)
fieldsets = (("User Info", {"fields": ("username", "email", "password")}),)
add_fieldsets = (
(
None,
{
"fields": ("username", "email", "password1", "password2"),
},
),
)
admin.site.register(User, CustomUserAdmin)
localhost:8000/adminを開くと、以下のようにユーザー情報が追加されます。
Addボタンを押してユーザーを追加しましょう。
認証機能実装
認証用URL定義
accounts/url.py
を作成して、認証用のurlを定義します
from django.contrib.auth import views as auth_views
from django.urls import path
urlpatterns = [
path(
"login/",
auth_views.LoginView.as_view(template_name="accounts/login.html"),
name="login",
),
]
ログイン画面テンプレート作成
accounts/templates/accounts/login.html
<h1>ログイン</h1>
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">ログイン</button>
</form>
認証用URL登録
myapp/urls.pyにURL定義を追加します。
urlpatterns = [
path("admin/", admin.site.urls),
path("accounts/", include("accounts.urls")),
]
http://localhost:8000/accounts/login
にアクセスするとログインページが表示されます。
先ほど作成したユーザーでログインしてみましょう。
ログインに成功すると、以下の画面が表示されます。
ログインに成功すると、デフォルト設定では、accounts/profile にリダイレクトされます。
リダイレクト先を変更するには、settings.py に以下のように記述します。
LOGIN_REDIRECT_URL = "dashboard"
プロフィール画面作成
それでは続いて、プロフィール画面を作っていきましょう。
まずは、ビューを定義します。
accounts/views.py
from django.shortcuts import render
# Create your views here.
def profile(request):
return render(request, template_name="accounts/profile.html")
続いてテンプレートを作成します。
accounts/templates/accounts/profile.html
<h1>ユーザ情報</h1>
<p>ユーザ名:{{ request.user.username }}</p>
<p>メールアドレス:{{ request.user.email }}</p>
URLを登録します。
accounts/urls.py
from django.contrib.auth import views as auth_views
from django.urls import path
from . import views
urlpatterns = [
path(
"login/",
auth_views.LoginView.as_view(template_name="accounts/login.html"),
name="login",
),
path("profile/", views.profile, name="profile"),
]
再び、
http://localhost8000/accounts/profile
にアクセスしましょう。
以下の画面が表示されます。
ログアウト機能作成
最後に、ログアウト機能を作成します。
まずは、ログアウト用のURLを登録しましょう。
accounts/urls.py
from django.contrib.auth import views as auth_views
from django.urls import path
from . import views
urlpatterns = [
path(
"login/",
auth_views.LoginView.as_view(template_name="accounts/login.html"),
name="login",
),
path("profile/", views.profile, name="profile"),
path("logout/", auth_views.LogoutView.as_view(), name="logout"),
]
プロフィール画面にログアウトボタンを設置します。
<h1>ユーザ情報</h1>
<p>ユーザ名:{{ request.user.username }}</p>
<p>メールアドレス:{{ request.user.email }}</p>
<form method="POST" action="{% url 'logout' %}">
{% csrf_token %}
<button type="submit">ログアウト</button>
</form>
ログアウトボタンが追加されます。
myapp/settings.pyに以下の記述を追加します。
LOGOUT_REDIRECT_URL = "/accounts/login"
このように設定するとログアウト後
/accounts/login
にリダイレクトされます。
実際にログアウトしてみて正しく動いているか確認してみてください。
ルート保護
まずは、ログインしていない状態でプロフィールページにアクセスできないように制限します。
ビューの定義を以下のように変更します。
accounts/views.py
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
# Create your views here.
@login_required
def profile(request):
return render(request, template_name="accounts/profile.html")
未認証の状態で
/accounts/profile
にアクセスするとログインページにリダイレクトされるようになりました。
続いて、認証済みの状態でログインページにアクセスした際にプロフィール画面にリダイレクトしましょう。
URL定義を以下のように変更しましょう。
accounts/urls.py
from django.contrib.auth import views as auth_views
from django.urls import path
from . import views
urlpatterns = [
path(
"login/",
auth_views.LoginView.as_view(
redirect_authenticated_user=True, template_name="accounts/login.html"
),
name="login",
),
path("profile/", views.profile, name="profile"),
path("logout/", auth_views.LogoutView.as_view(), name="logout"),
]
redirect_authenticated_user=True
を設定することで認証済みユーザーをリダイレクトします。
まとめ
以上が、Djangoでカスタムユーザーを定義し、認証機能を実装する手順の詳細です。この流れを通じて、ユーザー管理の基礎をしっかりと理解し、実践できるようになります!
この記事へのコメントはありません。