アーキテクチャ
概要
Lase は 管理者 (Admin) と テナント (Tenant) という 2 つのコンテキストを中心に設計されています。どちらも Sanctum ベースのトークン認証を使用し、Authorize ミドルウェアでコンテキストを分離します。
┌───────────────────────────────────────────────────────┐
│ Laravel Application │
│ │
│ ┌─────────────┐ ┌─────────────────────────┐ │
│ │ Admin API │ │ Tenant API │ │
│ │ /api/admin/ │ │ {code}.domain/api/tenant│ │
│ └──────┬──────┘ └────────────┬────────────┘ │
│ │ Authorize:admin │ Authorize:tenant + IdentifyTenant
│ ┌──────▼──────┐ ┌────────────▼────────────┐ │
│ │ AdminUser │ │ TenantUser / User │ │
│ └─────────────┘ └─────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Common API /api/ │ │
│ │ (認証不要 or auth ミドルウェアのみ) │ │
│ └─────────────────────────────────────────────────┘ │
└───────────────────────────────────────────────────────┘ルート構成
| プレフィックス | ファイル | 用途 |
|---|---|---|
/api/admin/ | routes/api/admin.php | 管理者向け操作(テナント・サブスクリプション・プラン等) |
{code}.domain/api/tenant/ | routes/api/tenant.php | テナントユーザー向け操作 |
/api/ | routes/api/common.php | 全ユーザー共通(アプリ情報・チャット・プロフィール) |
/api/ (public) | routes/api/public.php | 認証不要のパブリックエンドポイント |
テナント識別の仕組み
テナント API はサブドメイン形式 ({tenantCode}.example.com) で分離されます。IdentifyTenant ミドルウェアがリクエストのサブドメインからテナントを解決し、$request->attributes->get('tenant') で取得できるようにします。
リクエスト: https://acme.example.com/api/tenant/...
↓
IdentifyTenant ミドルウェア
↓
Cache::remember("tenant:acme", ...) でテナントを取得
↓
$request->attributes->set('tenant', $tenant)
↓
コントローラに到達認証フロー
管理者
- 管理者が
/api/admin/auth/activateでアカウントを有効化(招待リンク経由) - Sanctum トークンでログイン
- 各リクエストで
auth+authorize:adminミドルウェアを通過
テナントユーザー
- テナントユーザーが
{code}.domain/api/auth/login-by-tokenでログイン or 招待リンク経由でアカウント有効化 - Sanctum トークンでログイン
- 各リクエストで
auth+authorize:tenant+tenantミドルウェアを通過
ロール・権限
管理者とテナントユーザーそれぞれにロールと権限が存在します。
| モデル | ロール | 権限 |
|---|---|---|
| AdminUser | AdminRole | AdminRolePermission |
| TenantUser (User) | TenantRole | TenantRolePermission |
権限の判定は AuthorizerRegistry に登録された AdminAuthorizer / TenantAuthorizer が担います。アプリ側で独自の Authorizer を登録することも可能です。