ロールベースアクセス制御 (RBAC)
Speakeasy は better-auth の Organization プラグインをベースに、4段階のロールベースアクセス制御を実装しています。
システムロール
Section titled “システムロール”better-auth の admin プラグインが提供するシステムレベルのロールです。
| ロール | 説明 | 対象 |
|---|---|---|
admin | システム管理者 | Penthouse アクセス可 |
user | 一般ユーザー | Counter のみ |
システムロールは user.role フィールドに保存されます。
各組織内で付与されるロールです。member.role フィールドに保存されます。
| ロール | 日本語名 | 説明 |
|---|---|---|
owner | オーナー | 組織の全権限。組織削除・メンバー管理 |
admin | 管理者 | 組織設定変更・メンバー管理(オーナー権限除く) |
member | メンバー | チャット・連絡先・配信の操作 |
staff | スタッフ | 閲覧中心の限定権限 |
権限マトリクス
Section titled “権限マトリクス”| 操作 | owner | admin | member | staff |
|---|---|---|---|---|
| 組織情報の閲覧 | o | o | o | o |
| 組織情報の更新 | o | o | - | - |
| 組織の削除 | o | - | - | - |
メンバー操作
Section titled “メンバー操作”| 操作 | owner | admin | member | staff |
|---|---|---|---|---|
| メンバー一覧の閲覧 | o | o | o | o |
| メンバーの招待 | o | o | - | - |
| メンバーの削除 | o | o | - | - |
| ロール変更 | o | o | - | - |
チャット操作
Section titled “チャット操作”| 操作 | owner | admin | member | staff |
|---|---|---|---|---|
| チャットルーム一覧 | o | o | o | o |
| チャットルーム作成 | o | o | o | o |
| メッセージ送信 | o | o | o | o |
| メッセージ閲覧 | o | o | o | o |
| チャットルーム削除 | o | o | o | - |
| 操作 | owner | admin | member | staff |
|---|---|---|---|---|
| 連絡先一覧 | o | o | o | - |
| 連絡先作成 | o | o | o | - |
| 連絡先更新 | o | o | o | - |
| 連絡先削除 | o | o | o | - |
一括配信操作
Section titled “一括配信操作”| 操作 | owner | admin | member | staff |
|---|---|---|---|---|
| 配信一覧 | o | o | o | o |
| 配信作成 | o | o | o | - |
| 配信編集 | o | o | o | - |
| 配信削除 | o | o | - | - |
| 配信キャンセル | o | o | o | - |
権限定義の実装
Section titled “権限定義の実装”Door Gateway の permissions.ts で Access Control リストを定義しています。
// リソース定義const resources = { organization: ['update', 'delete'], member: ['create', 'read', 'delete'], invitation: ['create', 'read', 'cancel'], chat: ['create', 'read', 'delete'], contact: ['create', 'read', 'update', 'delete'], broadcast: ['create', 'read', 'delete']} as const;
// ロール別権限const roles = { owner: { organization: ['update', 'delete'], member: ['create', 'read', 'delete'], chat: ['create', 'read', 'delete'], contact: ['create', 'read', 'update', 'delete'], broadcast: ['create', 'read', 'delete'] }, admin: { organization: ['update'], member: ['create', 'read', 'delete'], chat: ['create', 'read', 'delete'], contact: ['create', 'read', 'update', 'delete'], broadcast: ['create', 'read', 'delete'] }, member: { member: ['read'], chat: ['create', 'read', 'delete'], contact: ['create', 'read', 'update', 'delete'], broadcast: ['create', 'read'] }, staff: { member: ['read'], chat: ['create', 'read'], broadcast: ['read'] }};カスタムロール
Section titled “カスタムロール”組織ごとにカスタムロールを作成できます。
Base RPC: createRole({ organizationId, name, description?, permissions? })Base RPC: assignRole({ roleId, memberId })カスタムロールは Vault DB の organizationRole テーブルに保存され、memberRole テーブルでメンバーに割り当てられます。
権限チェックの実行箇所
Section titled “権限チェックの実行箇所”| レイヤー | チェック内容 |
|---|---|
| SvelteKit hooks | セッション有効性、アクティブ組織 |
| Remote Functions | ロールによる機能制限 |
| RPC メソッド | Cookie からのセッション検証 |
| Proof Service | better-auth の AC ミドルウェア |
- 組織管理 - 組織の階層構造
- Proof RPC メソッド - 権限関連 RPC
- Vault 組織テーブル - ロール DB スキーマ