Skip to content

Latest commit

 

History

History
188 lines (115 loc) · 8.78 KB

File metadata and controls

188 lines (115 loc) · 8.78 KB

チュートリアル: 認可を設定する

所要時間: 約 30 分

ログインは最初から入っているので、ここでは認可(ログインしたユーザーに何を見せ、何を書かせるか)をデザイナで段階的に設定します。

  • 認証 = 誰かを特定する仕組み(ログイン)
  • 認可 = 何ができるかを制御する仕組み(アクセス権)

Codeer.LowCode.Blazor では、認証はホストアプリ側 (テンプレートが生成するコードと MIT の Extras) で行い、認可はデザイナで設定します。認証は Cookie 認証のコードがテンプレートに含まれています (認証の全体像)。

認証・認可の全体像


前提


ステップの全体像

ステップ やること 対象
1 CurrentUserModule を作成 ユーザー情報を保持するモジュール
2 app.clprj で CurrentUserModule を指定 アプリ全体
3 PageFrame に表示条件を設定 画面グループ単位
4 Module にアクセス条件を設定 モジュール単位
5 データ単位のアクセス条件を設定 行単位

Step 1. CurrentUserModule を用意する

CurrentUserModule は、ログイン中のユーザーの情報を持つ特別なモジュールです。 通常は AppUser のようなテーブルに対応させます。

最低限必要な Field

Field 役割
Id(System Field) ユーザーの一意キー
UserName(Text など) 認証で使う ID
Rank など任意のカラム 権限レベルの判定に使う

Cookie 認証のテンプレートでは、ユーザーモジュールに置いた LoginAccountContractField (ログインアカウント契約) の LoginName が指すフィールドでログイン ID を照合し、該当ユーザーの行の Id を Cookie に載せます。


Step 2. app.clprj で CurrentUserModule を指定する

デザイナで app.clprj を開き、CurrentUserModule に Step 1 で作ったモジュールを指定します。

アプリ全体の認可設定

アプリ全体のアクセス制限

CurrentUserModule のさらに条件を設定することで、アプリ全体のアクセス可能ユーザーを絞れます。

例: Rank >= 1 のユーザーだけアプリにアクセスできる

→ 条件を満たさないユーザーは、ログイン後であってもどのページ・どのデータにもアクセスできません。


Step 3. PageFrame ごとのアクセス制限

PageFrame ごとに表示条件を設定できます。

PageFrameの認可

例: Rank >= 2 のユーザーだけ Main.frm を表示できる

これは画面グループ単位のアクセス制御です。管理者向け画面グループと一般ユーザー画面グループを分ける、といった使い方をします。


Step 4. Module ごとのアクセス制限

各 Module に以下 4 つの条件を設定できます。

Moduleの認可

条件 意味
UserRead このユーザーはデータを読める
UserWrite このユーザーはデータを書き換えられる
DataRead このデータを(このユーザーは)読めるか
DataWrite このデータを(このユーザーは)書き換えられるか

UserRead / UserWrite — ユーザーによる制御

  • UserRead が false のユーザー → このモジュールのデータにアクセスできない。サイドバーやヘッダのモジュールリストからも消える
  • UserWrite が false のユーザー → 読めるが、追加・編集・削除ができない

例:

UserRead: true
UserWrite: CurrentUser.Rank >= 3

→ 誰でも見られるが、Rank 3 以上しか編集できない


Step 5. データ単位のアクセス制限

同じモジュールでも、行単位で閲覧・編集可否を制御できます。

データによる認可

DataRead — 行単位の読み取り制御

一覧に表示されるデータが、条件を満たす行だけに絞られます。

例(同一組織のデータのみアクセス可能):

DataRead: CurrentUser.OrganizationId.Value == this.OrganizationId.Value

→ 他組織のデータは存在しないかのように扱われます。SelectField のプルダウンからも消えます。

DataWrite — 行単位の書き込み制御

条件を満たさない行は表示はできるが編集できない状態になります。

例(自分が作成したデータのみ編集可能):

DataWrite: CurrentUser.Id.Value == this.Creator.Value

認証について(ライブラリの外)

認証は Codeer.LowCode.Blazor 本体の機能ではなく、テンプレートが生成するホストのコードと MIT の Extras にあります。 特別なカスタマイズが不要なら、テンプレートのまま使えます。

Cookie 認証のテンプレートには次のような実装が含まれます:

  • ModuleDataController[Authorize, AutoValidateAntiforgeryToken] が付与されている
  • IAuthenticationContext.GetCurrentUserIdAsync が Cookie からログイン中ユーザーの Id (ユーザーモジュールの Id) を返す
  • ログイン・ログアウト・外部 IdP・二要素認証のエンドポイントを持つ AccountController と、ログイン画面 (login.html)
  • ID/パスワード照合・外部 IdP・二要素認証の実装は Codeer.LowCode.Blazor.Extras (MIT)

→ 認証の詳細: 認証の全体像 (Extras) / 認可の詳細: 認証・認可の概要

独自認証に差し替えたい場合

Entra ID / Google / AWS Cognito / OpenID Connect は設定だけで足せます (外部ログイン)。それ以外の社内 SSO・JWT などもホスト側のコードを書き換えれば対応できます。Codeer.LowCode.Blazor が要求するのは「現在のユーザーの Id を返せること」だけです。


デプロイして確認する

認可の設定はデプロイ後にブラウザで次の順に確認します。

  1. ログアウト状態でアクセス → ログイン画面に飛ぶ
  2. 権限のないユーザーでログイン → アプリ自体に入れない、または一部画面だけ表示される
  3. 権限のあるユーザーでログイン → すべて見える・編集できる
  4. 他組織のデータが混在する状態 → 自分の組織のデータだけが出てくる

つまずきやすいポイント

Q. ログインはできるがアプリに入れない

app.clprj の CurrentUserModule に該当ユーザーの行があるかを確認します。ログインした ID(ログインアカウント契約の LoginName が指すフィールド)に対応する行がないと、どこにもアクセスできません。

Q. サイドバーのメニューが一部出ない

その Module の UserRead 条件を満たしていない可能性があります。条件式を見直すか、デバッグ目的で UserRead: true に戻して挙動を確認します。

Q. 他組織のデータが見えてしまう

Module の DataRead を設定していないか、条件式が正しくないかです。this.{カラム}.Value == CurrentUser.{カラム}.Value の書き方を確認してください。


次に読む