【Django入門9】認証システムの構築|ログイン・ログアウト機能を実装する方法

認証システムの基本

認証とは?

認証とは、ユーザーがアプリケーションにアクセスする際に本人であることを確認する仕組みです。Djangoには、標準でログイン、ログアウト、ユーザー登録といった基本的な認証機能が備わっています。

なぜ認証が必要なのか?

  • セキュリティの確保: 認証により、システムの利用者を制限し、個人情報の保護が可能になります。
  • カスタマイズ可能: Djangoの認証機能は、プロジェクトの要件に合わせてカスタマイズすることができます。

認証システムのセットアップ

プロジェクトの準備

Djangoの認証システムを使うには、まずアプリケーションが適切に設定されていることを確認しましょう。

  1. Djangoプロジェクトを作成(まだ作成していない場合): django-admin startproject myproject cd myproject
  2. アプリを作成: python manage.py startapp accounts
  3. アプリをsettings.pyに登録: INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'accounts', # 作成したアプリを登録 ]

ログイン機能の実装

URLの設定

accounts/urls.pyという新しいファイルを作成し、ログイン用のURLを設定します。

from django.urls import path
from django.contrib.auth import views as auth_views

urlpatterns = [
    path('login/', auth_views.LoginView.as_view(template_name='accounts/login.html'), name='login'),
]

次に、myproject/urls.pyに次のように記述してaccountsのURLをインクルードします。

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/', include('accounts.urls')),
]

テンプレートの作成

ログイン画面のテンプレートをaccounts/templates/accounts/login.htmlとして作成します。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>ログイン</title>
</head>
<body>
    <h1>ログイン</h1>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="ログイン">
    </form>
</body>
</html>
  • {% csrf_token %}: セキュリティ対策として、クロスサイトリクエストフォージェリ(CSRF)を防止するトークンを埋め込む。
  • {{ form.as_p }}: フォームフィールドを段落形式で表示します。

ログアウト機能の実装

URLの設定

ログアウト用のURLをaccounts/urls.pyに追加します。

from django.urls import path
from django.contrib.auth import views as auth_views

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

ログアウト後のリダイレクト設定

デフォルトでは、ログアウト後にDjangoの管理画面のログインページにリダイレクトされますが、カスタムページにリダイレクトしたい場合は、設定ファイルに次のコードを追加します。

# settings.py
LOGOUT_REDIRECT_URL = '/accounts/login/'

これにより、ログアウト後にログインページにリダイレクトされます。

ビューのカスタマイズ

カスタムログインビューの作成

デフォルトのログインビューではなく、独自の処理を行いたい場合、カスタムビューを作成することができます。

from django.contrib.auth.forms import AuthenticationForm
from django.shortcuts import render, redirect
from django.contrib.auth import login

def custom_login_view(request):
    if request.method == 'POST':
        form = AuthenticationForm(request, data=request.POST)
        if form.is_valid():
            user = form.get_user()
            login(request, user)
            return redirect('home')
    else:
        form = AuthenticationForm()
    return render(request, 'accounts/login.html', {'form': form})

URLの設定

accounts/urls.pyでカスタムログインビューに対応するURLを設定します。

from django.urls import path
from .views import custom_login_view

urlpatterns = [
    path('login/', custom_login_view, name='login'),
]

認証済みユーザーの制御

ログインが必要なページの保護

Djangoには、認証済みのユーザーしかアクセスできないようにするためのデコレーターがあります。

例: ログイン必須のビュー

from django.contrib.auth.decorators import login_required
from django.shortcuts import render

@login_required
def dashboard(request):
    return render(request, 'accounts/dashboard.html')

ログイン状態の確認

テンプレート内でユーザーのログイン状態を確認するには、次のように記述します。

{% if user.is_authenticated %}
    <p>こんにちは、{{ user.username }}さん!</p>
    <a href="{% url 'logout' %}">ログアウト</a>
{% else %}
    <a href="{% url 'login' %}">ログイン</a>
{% endif %}

まとめ

Djangoの認証システムを使えば、基本的なログイン・ログアウト機能を短時間で構築できます。これにより、ユーザーごとに異なるページを表示したり、セキュアなコンテンツを保護することが可能です。次は、ユーザー登録機能やパスワードリセット機能など、より高度な認証機能に挑戦してみましょう。