Djangoでユーザー認証を実装する - ログイン機能の構築

Djangoの認証システムの利用

1. ユーザー認証処理

入力されたパスワードの検証にはDjangoのauthenticateメソッドを使用します。認証成功時はUserオブジェクトを、失敗時はNoneを返却します。

from django.contrib.auth import authenticate
account = authenticate(username=入力ID, password=入力パスワード)
if account is None:
    self.context['エラーメッセージ'] = 'IDまたはパスワードが一致しません'
    return self.レンダリング処理(request, self.context)
# アクティブ状態の確認
if not account.is_active:
    self.context['エラーメッセージ'] = 'アカウントが有効化されていません'

注意点: Django 2.0以降の非アクティブユーザー処理

非アクティブユーザーでも認証が成功するようにするにはsettings.pyに以下の設定が必要です。

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.AllowAllUsersModelBackend'
]

2. ログイン/ログアウトの実装

以下のようにセッション管理を実装することで、認証済みユーザーのみのページ制限が可能です。

from django.contrib.auth import login, logout

# 認証成功後の処理
login(request, account)

セッション情報はデフォルトでdjangosessionテーブルに保存され、セッションキーはクッキーとしてクライアントに送信されます。

認証済みユーザーの取得方法

  • ビュー側: request.user.username でユーザー名取得
  • テンプレート側: 自動でuserオブジェクトが渡される
{% if user.is_authenticated %}
<div class="user-panel">
    {{ user.username }}さん、ようこそ
    <a href="{% url 'logout-view' %}">ログアウト</a>
</div>
{% else %}
<div class="login-panel">
    <a href="{% url 'login-view' %}">ログイン</a>
    <a href="{% url 'signup-view' %}">新規登録</a>
</div>
{% endif %}

3. 認証必須ページの実装

3.1 基本的な認証チェック

from django.shortcuts import redirect
from django.conf import settings

def 保護されたビュー(request):
    if not request.user.is_authenticated:
        return redirect(f'{settings.LOGIN_URL}?next={request.path}')

3.2 デコレータによる簡易実装

from django.contrib.auth.decorators import login_required

@login_required(
    redirect_field_name='next',
    login_url='/accounts/login/'
)
def 保護されたビュー(request):
    # 認証済みの処理

3.3 クラスベースビューでの実装

from django.contrib.auth.mixins import LoginRequiredMixin

class 保護されたビュー(LoginRequiredMixin, View):
    login_url = '/auth/login/'
    redirect_field_name = 'return_path'

セッションストレージの最適化

Redisを用いたキャッシュ/セッション管理

django-redisパッケージを使用することで、Redisをキャッシュ・セッションストレージとして利用可能です。

インストール手順

pip install django-redis

キャッシュ設定

CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/1',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
        }
    }
}

セッション設定

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'

タグ: Django 認証システム redis セッション管理

7月1日 17:50 投稿