導入
会員制サイト、マイページ、管理画面 ―― 「ログイン」はほとんどのアプリに必要です。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 が用意しています。