情報応用演習Ⅰ(2024)

【T9a】簡易ブログソフトウェアの作成 Part.Ⅰ ~ 認証機能の組み込み(3/14)

プロジェクトタイプASP.NET Core Web アプリ(Model-View-Controller)
プロジェクト名T9a
ソリューション名PIT9
ターゲットフレームワーク.NET 8.0(長期的なサポート)
最上位レベルのステートメントを使用しない使用する(チェックオフ)

9a-3. 作成するソフトウェアの仕様

今回作成するウェブログソフトウェアの仕様を簡単に説明する.

  • 【ユーザー関連の機能】
    • このソフトウェアには「管理者ユーザー」「通常ユーザー」「匿名ユーザー(ログインしないユーザー)」が存在する.
    • 「管理者ユーザー」ができることは以下である.
      1. 「通常ユーザー」を作成する.
      2. 「通常ユーザー」のユーザー情報(ニックネームやメールアドレスなど)を編集する.
      3. 「通常ユーザー」を削除する.
      4. あらゆる記事を編集,削除できる1
      5. ただし管理者ユーザーは自分自身のユーザー情報の編集や削除は行うことができない(パスワードの変更は可能).
    • 「通常ユーザー」ができることは以下である.
      1. 自分自身のユーザー情報を編集する.
      2. 自分自身のアカウントを削除する(=退会).
      3. 記事を作成する.
      4. 自分で作成した記事を編集する.
      5. 自分で作成した記事を削除する.
    • 「匿名ユーザー」ができることは以下である.
      1. 公開済みの記事を閲覧する.
  • 【記事関連の機能】
    • 記事はタイトル,本文などの情報を含んでいる.
    • 記事には「公開済み」「下書き」の状態があり,「匿名ユーザー」は「公開済み」の記事のみ表示できる.
      • 「下書き」状態はその記事の持ち主のみが表示,編集可能である.

ユーザー関連の機能は前章で使用した ASP.NET Core Identity を使用する.前章では アプリケーション内で,アプリケーション用/Identity用の二つのデータコンテキストを管理するアプローチで ASP.NET Core Identity を使用したが,今回はアプリケーション用のデータコンテキストクラスそのものに Identity 用の データコンテキストクラスを組み込んで使用するアプローチ(_)を学ぶ.

今回のASP.NET Core Identityの使用方法

ASP.NET Core Identity に含まれているエンティティを_に再掲する.

ASP.NET Core Identityが使用するエンティティの関係

このうち「ユーザー」に相当するモデルクラス IdentityUserには _に示すデータが予め含まれている.

IdentityUserクラスに含まれるデータ項目
項目名必須/任意データ型備考
Id必須文字列主キー(GUID).
UserName任意文字列ユーザー名.
NormalizedUserName任意文字列正規化されたユーザー名.
Email任意文字列メールアドレス.
NormalizedEmail任意文字列正規化されたメールアドレス.
EmailConfirmed必須真理値メールアドレスの確認済みフラグ.
PasswordHash任意文字列ユーザーのパスワードハッシュ.
SecurityStamp任意文字列認証処理のためのランダム値.
ConcurencyStamp任意文字列並列処理のためのランダム値.
PhoneNumber任意文字列電話番号.
PhoneNumberConfirmed必須真理値電話番号の確認済みフラグ.
TwoFactorEnabled必須真理値二要素認証の有効化フラグ.
LockoutEnd任意日付時刻ロックアウト終了日.
LockoutEnabled任意真理値ロックアウト可能フラグ.
AccessFailedCount必須整数ユーザーの認証失敗回数.

ASP.NET Core Identity が内部的に使用するデータ項目も含まれているが,一部はアプリケーションでそのまま使用することができる. これらのユーザー情報について知っておくべきことは以下のことである.

  • Idが文字列型( string 型)であること.
    • これはGUIDと呼ばれる128bit整数をもとにした一意識別子である.
    • この情報は通常は表示に使用しない方がよい.
  • UserNameは主キーではないが一意である.
    • 言い換えれば同じユーザー名のアカウントは作成できない.

この「ユーザー」の情報にアプリケーション独自のデータを追加するには, IdentityUserクラス を継承したモデルクラスを作成して,プロパティを追加すればよい.また,データコンテキストクラスは通常は DbContextクラス (Microsoft.EntityFrameworkCore名前空間)を継承するが,独自のユーザークラスを使用する場合は IdentityDbContextジェネリッククラス(Microsoft.AspNetCore.Identity.EntityFrameworkCore名前空間)を継承する. ジェネリックパラメーターのTUserにはIdentityUserクラスを継承した独自の「ユーザー」クラスを指定する. 今回はこの方法で「ユーザー」クラスを作成することにする. また,今回は前述した通りそのユーザーが「管理者ユーザー」か「通常ユーザー」かといった区別をつける必要があるが, これはユーザーのグループであるIdentityRoleとその所属情報であるIdentityUserRoleをそのまま使用することにする.

今回作成するデータモデルについても簡単に説明しておこう.今回主に扱うのは「ユーザー」と「記事」の二つのデータモデルである. 1人の「ユーザー」は自分の所有物として多数の「記事」を作成することができる.したがって,「ユーザー」と「記事」の関係は 「ユーザー」1─多「記事」となる.また,ある「ユーザー」が管理者ユーザーか,通常ユーザーかのどちらに所属しているかを判定するのに 使用するだけであるが,このために「グループ(ロール)」のエンティティを用いる.「グループ」と「ユーザー」は概念的には多対多であり, これを扱うために間に「グループ所属」のエンティティが必要になる(所謂「対照表」).

まとめると,このアプリケーションは_に示すデータモデルを扱うことになる.

ウェブログのためのデータモデル

このアプリケーションは主に以下の2つのコントローラーで構成することにする.

  • Accountsコントローラー
    • アカウント関連の操作を担う.
  • Articlesコントローラー
    • 記事関連の操作を担う.

各々のコントローラーの各アクション/ビューの画面イメージや画面遷移については個々のコントローラーを 作成するときに解説することにして,次節ではとりあえずプロジェクトを作成して基本的な設定を済ませよう.


  1. ただし他人を騙っての記事作成はできない ↩︎

Last updated on 2024-06-19
Published on 2024-06-19

Powered by Hugo. Theme by TechDoc. Designed by Thingsym.