本文へスキップ
BecomeCoder

Djangoコース · 第6章 アプリを組み立てる · レッスン30

ユーザー認証 ― ログインの仕組み

ローカル実施

導入

会員制サイト、マイページ、管理画面 ―― 「ログイン」はほとんどのアプリに必要です。Django は認証機能(django.contrib.auth)を標準で備えており、自分で作るより安全で簡単です。

説明

Django の認証は django.contrib.auth が担当します。User モデル、パスワードの安全な保存(ハッシュ化)、ログイン・ログアウト、権限管理までが最初から入っています。

from django.contrib.auth.models import User

# ユーザー作成(パスワードは自動でハッシュ化されて保存される)
user = User.objects.create_user(username="aki", password="secret123")

# 認証(ユーザー名とパスワードの照合)
from django.contrib.auth import authenticate
u = authenticate(username="aki", password="secret123")   # 一致すれば User、違えば None

ビューでの流れは、login / logout 関数と、「ログイン必須」を示すデコレータを使います。

from django.contrib.auth import login, logout
from django.contrib.auth.decorators import login_required

def my_login(request):
    if request.method == "POST":
        user = authenticate(request,
            username=request.POST["username"],
            password=request.POST["password"])
        if user is not None:
            login(request, user)          # セッションにログイン状態を保存
            return redirect("/mypage/")
    return render(request, "login.html")

@login_required   # 未ログインなら自動でログインページへ飛ばす
def mypage(request):
    return HttpResponse(f"ようこそ {request.user.username} さん")
  • authenticate(...) … ユーザー名とパスワードを照合。合えば User、違えば None
  • login(request, user) … ログイン状態をセッション(サーバー側の記録+ブラウザのクッキー)に保存。以降のリクエストで request.user から誰かが分かります。
  • @login_required … このビューはログイン必須。未ログインなら自動でログインページへリダイレクト。
  • logout(request) … ログアウト。
flowchart LR
  F["ログインフォーム<br/>POST"] --> A["authenticate<br/>照合"]
  A -->|"一致"| L["login()<br/>セッション保存"]
  L --> P["以降 request.user で<br/>ログインユーザーが分かる"]
  A -->|"不一致"| E["再入力"]

安全のポイント:パスワードは平文では保存されず、Django が強力なハッシュ(PBKDF2 など)で保存します。自前でログインを実装すると、このハッシュ化やセッション管理、総当たり対策などで抜けが出がち。Django の標準機能を使うのが、最も安全で確実です。ログイン画面のテンプレートやパスワードリセットのメール送信まで、django.contrib.auth が用意しています。