記事一覧へ戻る 本の順番で続きを読む

Django 認証と権限管理 - ユーザーシステムの構築

Python3上級 | 2026/02/18 21:20

Django 認証と権限管理

認証ビューの設定

# config/urls.py
from django.contrib.auth import views as auth_views

urlpatterns = [
    path('login/', auth_views.LoginView.as_view(
        template_name='registration/login.html'
    ), name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
    path('password_change/', auth_views.PasswordChangeView.as_view(),
         name='password_change'),
]

# settings.py
LOGIN_REDIRECT_URL = '/'
LOGOUT_REDIRECT_URL = '/'
LOGIN_URL = '/login/'

ログインテンプレート

{# templates/registration/login.html #}
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">ログイン</button>
</form>
{% if form.errors %}
    <p>ユーザー名またはパスワードが正しくありません。</p>
{% endif %}

ユーザー登録

# accounts/views.py
from django.contrib.auth.forms import UserCreationForm
from django.views.generic import CreateView
from django.urls import reverse_lazy

class SignUpView(CreateView):
    form_class = UserCreationForm
    template_name = 'registration/signup.html'
    success_url = reverse_lazy('login')

アクセス制御

# 関数ビュー
from django.contrib.auth.decorators import login_required, permission_required

@login_required
def profile(request):
    return render(request, 'profile.html')

@permission_required('blog.add_post', raise_exception=True)
def create_post(request):
    pass

# クラスビュー
from django.contrib.auth.mixins import (
    LoginRequiredMixin, PermissionRequiredMixin, UserPassesTestMixin
)

class PostCreateView(LoginRequiredMixin, CreateView):
    model = Post
    fields = ['title', 'body']

class PostDeleteView(UserPassesTestMixin, DeleteView):
    model = Post
    def test_func(self):
        post = self.get_object()
        return self.request.user == post.author

カスタムユーザーモデル

# accounts/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    display_name = models.CharField('表示名', max_length=50, blank=True)
    avatar = models.ImageField('アバター', upload_to='avatars/', blank=True)
    bio = models.TextField('自己紹介', blank=True)

    def __str__(self):
        return self.display_name or self.username
# settings.py
AUTH_USER_MODEL = 'accounts.CustomUser'

重要: カスタムユーザーモデルはプロジェクト開始時に設定してください。後から変更するとマイグレーションが複雑になります。

テンプレートでの認証チェック

{% if user.is_authenticated %}
    <p>こんにちは、{{ user.username }}さん</p>
    {% if user.is_staff %}
        <a href="/admin/">管理画面</a>
    {% endif %}
    {% if perms.blog.add_post %}
        <a href="{% url 'blog:post_create' %}">記事作成</a>
    {% endif %}
{% else %}
    <a href="{% url 'login' %}">ログイン</a>
{% endif %}

まとめ

  • Django標準の認証ビューでログイン/ログアウト/パスワード変更
  • @login_required / LoginRequiredMixin でログイン必須
  • UserPassesTestMixin でカスタム権限チェック
  • プロジェクト開始時にカスタムユーザーモデルを設定する
  • テンプレートで user.is_authenticated / perms で表示制御