【T9a】簡易ブログソフトウェアの作成 Part.Ⅰ ~ 認証機能の組み込み(3/14)
プロジェクトタイプ | ASP.NET Core Web アプリ(Model-View-Controller) |
---|---|
プロジェクト名 | T9a |
ソリューション名 | PIT9 |
ターゲットフレームワーク | .NET 8.0(長期的なサポート) |
最上位レベルのステートメントを使用しない | 使用する(チェックオフ) |
9a-3. 作成するソフトウェアの仕様
今回作成するウェブログソフトウェアの仕様を簡単に説明する.
- 【ユーザー関連の機能】
- このソフトウェアには「管理者ユーザー」「通常ユーザー」「匿名ユーザー(ログインしないユーザー)」が存在する.
- 「管理者ユーザー」ができることは以下である.
- 「通常ユーザー」を作成する.
- 「通常ユーザー」のユーザー情報(ニックネームやメールアドレスなど)を編集する.
- 「通常ユーザー」を削除する.
- あらゆる記事を編集,削除できる1.
- ただし管理者ユーザーは自分自身のユーザー情報の編集や削除は行うことができない(パスワードの変更は可能).
- 「通常ユーザー」ができることは以下である.
- 自分自身のユーザー情報を編集する.
- 自分自身のアカウントを削除する(=退会).
- 記事を作成する.
- 自分で作成した記事を編集する.
- 自分で作成した記事を削除する.
- 「匿名ユーザー」ができることは以下である.
- 公開済みの記事を閲覧する.
- 【記事関連の機能】
- 記事はタイトル,本文などの情報を含んでいる.
- 記事には「公開済み」「下書き」の状態があり,「匿名ユーザー」は「公開済み」の記事のみ表示できる.
- 「下書き」状態はその記事の持ち主のみが表示,編集可能である.
ユーザー関連の機能は前章で使用した ASP.NET Core Identity を使用する.前章では アプリケーション内で,アプリケーション用/Identity用の二つのデータコンテキストを管理するアプローチで ASP.NET Core Identity を使用したが,今回はアプリケーション用のデータコンテキストクラスそのものに Identity 用の データコンテキストクラスを組み込んで使用するアプローチ(_)を学ぶ.
ASP.NET Core Identity に含まれているエンティティを_に再掲する.
このうち「ユーザー」に相当するモデルクラス 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名前空間)を継承するが,独自のユーザークラスを使用する場合は
IdentityDbContextTUser
にはIdentityUser
クラスを継承した独自の「ユーザー」クラスを指定する.
今回はこの方法で「ユーザー」クラスを作成することにする.
また,今回は前述した通りそのユーザーが「管理者ユーザー」か「通常ユーザー」かといった区別をつける必要があるが,
これはユーザーのグループであるIdentityRole
とその所属情報であるIdentityUserRole
をそのまま使用することにする.
今回作成するデータモデルについても簡単に説明しておこう.今回主に扱うのは「ユーザー」と「記事」の二つのデータモデルである. 1人の「ユーザー」は自分の所有物として多数の「記事」を作成することができる.したがって,「ユーザー」と「記事」の関係は 「ユーザー」1─多「記事」となる.また,ある「ユーザー」が管理者ユーザーか,通常ユーザーかのどちらに所属しているかを判定するのに 使用するだけであるが,このために「グループ(ロール)」のエンティティを用いる.「グループ」と「ユーザー」は概念的には多対多であり, これを扱うために間に「グループ所属」のエンティティが必要になる(所謂「対照表」).
まとめると,このアプリケーションは_に示すデータモデルを扱うことになる.
このアプリケーションは主に以下の2つのコントローラーで構成することにする.
- Accountsコントローラー
- アカウント関連の操作を担う.
- Articlesコントローラー
- 記事関連の操作を担う.
各々のコントローラーの各アクション/ビューの画面イメージや画面遷移については個々のコントローラーを 作成するときに解説することにして,次節ではとりあえずプロジェクトを作成して基本的な設定を済ませよう.
ただし他人を騙っての記事作成はできない ↩︎