1. HOME
  2. ブログ
  3. エンジニアリング
  4. 【Django】カスタムユーザーを作成して認証する全手順解説

BLOG

ブログ

エンジニアリング

【Django】カスタムユーザーを作成して認証する全手順解説

Djangoを使ったウェブアプリケーションの開発は、その柔軟性から多くの開発者に人気です。今回は、カスタムユーザーを作成し、ユーザー登録やプロフィール管理機能を実装する方法を詳しく解説します。カスタムユーザーモデルの重要性を理解し、Djangoアプリをセットアップすることで、実践的なスキルを身につけます。さらに、セキュリティ面にも配慮したログイン機能や、ユーザーが自分のプロフィールを管理できる機能を実装します。このチュートリアルを通じて、Djangoの魅力を最大限に引き出し、ユニークなユーザー管理機能を持つアプリケーションを作成する第一歩を踏み出しましょう!

チュートリアルの全体像

第1章: Djangoの開発環境を構築しよう

第2章: カスタムユーザー作成と認証導入 (now🐾)

第3章: ユーザー登録機能を実装

第4章: Tailwindを使って綺麗なページを作る

第5章: SNSのDB設計・モデル定義をしよう

第6章: 画像アップロードの実装方法を解説

第7章: SNSアプリの投稿機能を実装しよう

カスタムユーザーとは

カスタムユーザーは、Djangoの標準ユーザーモデル(Userモデル)を拡張または変更したユーザー管理のためのモデルです。デフォルトのユーザーモデルには、基本的な認証機能が備わっていますが、特定のプロジェクトやアプリケーションの要件に応じて、より柔軟なユーザー管理が必要になることがあります。

標準ユーザーモデルとその制約

Djangoの標準ユーザーモデルには以下のような特徴と制約があります。

フィールドの制限: 標準モデルには、usernameemailfirst_namelast_namepasswordなどの基本フィールドがありますが、これらを変更したり、追加したりすることはできません。

ユーザー名の必須性: デフォルトではusernameフィールドが必須ですが、他のプロジェクトではメールアドレスをユーザー識別子として使用したい場合もあります。

拡張性の欠如: 特定のビジネスロジックや機能に必要なフィールド(例: ユーザーの役割、プロフィール情報など)を追加するのが難しいです。

カスタムユーザーを使用する理由

カスタムユーザーを使用する理由は以下の通りです。

要件に応じた柔軟性: プロジェクトのニーズに応じて、フィールドを自由に追加・変更できるため、特定のビジネスロジックを実装しやすくなります。

ユーザー識別子の変更: usernameではなくemailを主な識別子として使用するなど、ユーザー認証の方法をカスタマイズできます。

複雑なロール管理: ユーザーの役割や権限を簡単に管理できるように、関連するフィールドを追加できます。

拡張性の確保: 将来的な機能追加や変更に対しても、柔軟に対応できる設計にできます。

データベースの整合性: 最初からカスタムユーザーモデルを使うことで、データベースのスキーマを整合性のあるものに保つことができます。

このように、カスタムユーザーを利用することで、Djangoアプリケーションの認証機能をより具体的な要件に合った形で実装できます。

認証用アプリ作成

まず、Djangoプロジェクト内に新しいアプリケーションを作成します。このアプリはユーザー管理に特化したもので、accountsという名前にします。

python manage.py startapp accounts

アプリ登録

作成したアプリをDjangoプロジェクトに登録します。これにより、Djangoはこのアプリを認識し、マイグレーションや管理サイトなどで利用できるようになります。settings.pyINSTALLED_APPSリストに以下を追加します。

INSTALLED_APPS = [
    # ...
    'accounts.apps.AccountsConfig',
]

カスタムユーザ定義

次に、accounts/models.pyでカスタムユーザーモデルを定義します。ここでは、ユーザーの基本情報(usernameemail)に加えて、必要なフィールドやメソッドを追加しています。

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でカスタムユーザーを定義し、認証機能を実装する手順の詳細です。この流れを通じて、ユーザー管理の基礎をしっかりと理解し、実践できるようになります!

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

関連記事