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で表示制御