Python Django 入門トップページ


ユーザ認証とコメント掲示板の開発

  1. プロジェクトの概要
  2. プロジェクトの作成と初期設定
  3. アプリケーションの作成と有効化
  4. ルートの記述
  5. ビューの定義
  6. HTML のテンプレート化
  7. HTML ファイルの作成
  8. Web ページ雛形の表示確認
  9. トップページの作成
  10. データベースのマイグレーション
  11. ユーザの作成
  12. ユーザ認証機能の実装
  13. セッション情報の確認
  14. ユーザ認証の状態を表示
  15. Navbar を設置
  16. モデルの作成とマイグレーション
  17. テストデータの投入
  18. コメントの一覧表示
  19. ページネーションと更新逆順表示
  20. コメント投稿機能の実装
  21. フラッシュメッセージ
  22. コメント詳細表示ページの実装
  23. 投稿者のユーザ名とメールアドレスの表示
  24. 投稿者であるかどうかの判断
  25. 編集・更新機能の実装
  26. コメント削除機能の実装
  27. Navbar の調整
  28. Profile の表示
  29. Profile の編集と更新
  30. パスワードの変更
  31. 管理サイトの準備
  32. 管理ユーザの登録
  33. 管理サイトへのログインとスタッフの登録
  34. グループの追加と権限の付与
  35. 管理サイトに comments アプリケーションを登録
  36. Comments アプリケーションから管理サイトへ

ユーザ認証とコメント掲示板の開発

ユーザの作成

これまでのステップでデータベースのテーブルがいくつか作成されました.ここでは,作成された auth_user テーブルにユーザ情報を登録します.将来的にはシステムの管理者がユーザ登録を行ったり,ユーザ自身が登録できるような機能が必要になるはずですが,ここではテストユーザとなる3名のユーザ情報を shell を使って登録します.

ここで登録するユーザの情報は次の表の通りです.

ユーザ名メールアドレスパスワード
user_aa@sample.compassword
user_bb@sample.compassword
user_cc@sample.compassword

シェルを使って次の通りユーザを登録していきます.

(py39) C:\Users\lecture\Documents\django\django_comment_auth>python manage.py shell ⏎
Python 3.9.12 (main, Apr  4 2022, 05:22:27) [MSC v.1916 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 8.3.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from django.contrib.auth.models import User ⏎

In [2]: user = User.objects.create_user('user_a', 'a@sample.com', 'password') ⏎

In [3]: user.save() ⏎

In [4]: user = User.objects.create_user('user_b', 'b@sample.com', 'password') ⏎

In [5]: user.save() ⏎

In [6]: user = User.objects.create_user('user_c', 'c@sample.com', 'password') ⏎

In [7]: user.save() ⏎

In [8]: exit() ⏎

(py39) C:\Users\lecture\Documents\django\django_comment_auth>

データベースのテーブルを表示して登録されたユーザ情報を確認します.

(py39) C:\Users\lecture\Documents\django\django_comment_auth>sqlite3 db.sqlite3 ⏎
SQLite version 3.38.2 2022-03-26 13:51:10
Enter ".help" for usage hints.
sqlite> .tables ⏎
auth_group                  auth_user_user_permissions
auth_group_permissions      django_admin_log
auth_permission             django_content_type
auth_user                   django_migrations
auth_user_groups            django_session
sqlite> .headers ON ⏎
sqlite> .schema auth_user ⏎
CREATE TABLE IF NOT EXISTS "auth_user" (
    "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    "password" varchar(128) NOT NULL,
    "last_login" datetime NULL,
    "is_superuser" bool NOT NULL,
    "username" varchar(150) NOT NULL UNIQUE,
    "last_name" varchar(150) NOT NULL,
    "email" varchar(254) NOT NULL,
    "is_staff" bool NOT NULL,
    "is_active" bool NOT NULL,
    "date_joined" datetime NOT NULL,
    "first_name" varchar(150) NOT NULL
);
sqlite> select * from auth_user; ⏎
id|password|last_login|is_superuser|username|last_name|email|is_staff|is_active|date_joined|first_name
1|pbkdf2_sha256$320000$W6LTnkmvRz9ZyP3WOCKul9$8rhGgvniFX3IvlDtqoKONbKGx0dgyCh/z0q18SnHttw=||0|user_a||a@sample.com|0|1|2022-07-27 18:16:33.539283|
2|pbkdf2_sha256$320000$70ab5GzMyXE5ji0yTvbfVQ$Kc/C4cP1GBxyScyw1d5QvXPxiRmH+A3nf4fxNBWTPvo=||0|user_b||b@sample.com|0|1|2022-07-27 18:16:44.852917|
3|pbkdf2_sha256$320000$jhkm7V1bNgaRjM5433ePrG$Bmvxi/otofgb4E541yt3C7jCxL3xs9oOPrI3bluuHHQ=||0|user_c||c@sample.com|0|1|2022-07-27 18:16:57.035969|
sqlite> select id, username, email from auth_user; ⏎
id|username|email
1|user_a|a@sample.com
2|user_b|b@sample.com
3|user_c|c@sample.com
sqlite> select password from auth_user; ⏎
password
pbkdf2_sha256$320000$W6LTnkmvRz9ZyP3WOCKul9$8rhGgvniFX3IvlDtqoKONbKGx0dgyCh/z0q18SnHttw=
pbkdf2_sha256$320000$70ab5GzMyXE5ji0yTvbfVQ$Kc/C4cP1GBxyScyw1d5QvXPxiRmH+A3nf4fxNBWTPvo=
pbkdf2_sha256$320000$jhkm7V1bNgaRjM5433ePrG$Bmvxi/otofgb4E541yt3C7jCxL3xs9oOPrI3bluuHHQ=
sqlite> .exit ⏎

(py39) C:\Users\lecture\Documents\django\django_comment_auth>

パスワードは NIST が推奨する PBKDF2 アルゴリズムと SHA256 ハッシュにより保護されています.パスワードは 【<アルゴリズム>$<イテレーション回数>$<ソルト>$<ハッシュ>】 の形式で保存されています.3名のユーザが同じパスワード「password」を設定していますが,ソルトが異なるので結果的には異なるハッシュとして保存されていることに注意してください.Django のパスワード管理についての詳細はこちらを参照してください.

次のページではログインやログアウト機能を実装していま作成したユーザを認証できるようにしてみよう.

目次に戻る