学習目標
前回は、TodoアプリのCRUD(登録・一覧表示・編集・削除)機能を完成させました。しかし、現在のアプリでは、誰でもすべてのTodoを操作できる状態になっています。
実際のWebアプリケーションでは、ユーザーごとにログインし、自分専用のデータだけを利用できる認証機能が必要です。Djangoには、このような認証機能が標準で用意されています。
この章では、ユーザー情報を表すUser、認証を行うauthenticate()、ログイン・ログアウトを行うlogin()とlogout()、ログインしているユーザーだけがページを利用できるようにするLoginRequiredMixinについて学習します。これらを利用して、安全なログイン機能を実装していきます。
この章を終えると、ユーザーがログイン・ログアウトできるようになり、ログインしているユーザーだけがTodoアプリを利用できるようになります。
アカウント管理
Userモデル
Djangoには、ユーザー情報を管理するためのUserモデルが標準で用意されています。Userモデルには、ユーザー名、パスワード、メールアドレス、権限など、ログインに必要な情報が保存されます。そのため、自分でユーザー管理の仕組みを一から実装する必要はなく、Djangoの標準機能を利用して認証機能を簡単に追加できます。これまで管理画面(Admin)へログインする際に使用していた管理ユーザーも、このUserモデルに登録されています。Djangoの認証機能は、このUserモデルを中心に動作しており、多くのWebアプリケーションで利用されている便利な仕組みです。
authenticate()メソッド
ログイン処理では、ユーザーが入力したユーザー名とパスワードが正しいかを確認する必要があります。その際に利用するのがauthenticate()です。
authenticate()にユーザー名とパスワードを渡すと、認証に成功した場合は対応するUserオブジェクトが返されます。一方、入力内容が間違っている場合はNoneが返されます。
ビューでは、この戻り値を確認することで、ログインを許可するかどうかを判断します。authenticate()は実際にログインを行う関数ではなく、入力された情報が正しいかどうかを確認するための認証処理を担当する重要な関数です。
login()メソッド
認証に成功しただけでは、ユーザーはまだログインした状態にはなりません。実際にログイン状態を開始するには、Djangoの**login()**を使用します。
例えば、login(request, user)と記述すると、認証済みのユーザーがログインした状態になります。ログインが完了すると、その情報はセッションに保存され、ブラウザを閉じるかログアウトするまでログイン状態が維持されます。
そのため、ページを移動するたびにユーザー名やパスワードを入力する必要はありません。login()は、認証に成功したユーザーをWebアプリケーションへログインさせるための重要な関数です。
logout()メソッド
ログアウトするには、Djangoの**logout()**を使用します。例えば、logout(request)を実行すると、現在のログイン状態が終了し、ユーザーはログアウトされます。
ログアウト後はセッション情報が削除されるため、ログインが必要なページへは再度ログインしない限りアクセスできません。一般的なWebアプリケーションでは、画面の上部やメニューにログアウトボタンを配置し、ユーザーがいつでも安全にログアウトできるようにしています。
logout()を利用することで、共有パソコンなどでも安心してアプリケーションを利用できるようになります。
アクセス制御
ログインしていないユーザーがTodo一覧や編集画面へアクセスできないようにするには、アクセス制限が必要です。
LoginRequiredMixinとは
ログインしていないユーザーがTodo一覧や編集画面へアクセスできないようアクセス制限を設定する際に利用するのが**LoginRequiredMixin**です。
クラスベースビューでは、class TodoListView(LoginRequiredMixin, ListView):のように継承するだけで、ログインが必要なページを簡単に作成できます。ログインしていないユーザーがアクセスすると、自動的にログイン画面へリダイレクトされます。
一方、ログイン済みのユーザーは通常どおりページを利用できます。LoginRequiredMixinを活用することで、認証が必要なページを安全に保護できるようになります。
ログイン処理の流れ
ログイン画面では、ユーザーが
- ユーザー名
- パスワード
を入力します。
その後、処理は次のような流れで実行されます。
- フォームからPOSTで送信する
authenticate()で認証する- 認証に成功したら
login()を実行する - Todo一覧画面へ移動する
認証に失敗した場合は、再度ログイン画面を表示し、ユーザー名またはパスワードが正しくないことを知らせます。
ログアウト処理の流れ
ログアウト処理は非常にシンプルです。
- ログアウトボタンを押す
logout()を実行する- ログイン画面へ移動する
ログアウトすると、ログイン情報が削除されます。
そのため、ログインが必要なページへ再びアクセスするには、もう一度ログインしなければなりません。
ログイン機能を完成させる
今回の学習内容を組み合わせると、ログイン機能は次のような流れになります。
ログイン画面
↓
ユーザー名・パスワード入力
↓
POST送信
↓
authenticate()
↓
login()
↓
Todo一覧画面
また、ログイン後に保護されたページへアクセスすると、
ログイン済み
↓
LoginRequiredMixin
↓
Todo一覧・登録・編集・削除画面
という流れになります。
ログアウトする場合は、
ログアウトボタン
↓
logout()
↓
ログイン画面
となります。
まとめ
この章では、Djangoの標準認証機能を利用して、ログイン・ログアウトの仕組みを学習しました。Userはユーザー情報を管理する標準Modelであり、ユーザー名やパスワードなどの情報を保持します。
authenticate()は入力されたユーザー名とパスワードを認証し、login()は認証に成功したユーザーをログイン状態にします。また、logout()を実行するとログイン状態が終了します。
さらに、LoginRequiredMixinを利用することで、ログイン済みのユーザーだけが特定のページへアクセスできるようになります。これらの機能を組み合わせることで、安全な認証機能を備えたWebアプリケーションを構築できます。
ここまでで、Todoアプリにログイン・ログアウト機能が追加され、認証されたユーザーだけが利用できるWebアプリケーションが完成しました。次回は、ログイン中のユーザーとTodoを関連付け、ユーザーごとに自分のTodoだけを表示・管理する方法を学習していきます。