Skip to content

アーキテクチャ

概要

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)

コントローラに到達

認証フロー

管理者

  1. 管理者が /api/admin/auth/activate でアカウントを有効化(招待リンク経由)
  2. Sanctum トークンでログイン
  3. 各リクエストで auth + authorize:admin ミドルウェアを通過

テナントユーザー

  1. テナントユーザーが {code}.domain/api/auth/login-by-token でログイン or 招待リンク経由でアカウント有効化
  2. Sanctum トークンでログイン
  3. 各リクエストで auth + authorize:tenant + tenant ミドルウェアを通過

ロール・権限

管理者とテナントユーザーそれぞれにロールと権限が存在します。

モデルロール権限
AdminUserAdminRoleAdminRolePermission
TenantUser (User)TenantRoleTenantRolePermission

権限の判定は AuthorizerRegistry に登録された AdminAuthorizer / TenantAuthorizer が担います。アプリ側で独自の Authorizer を登録することも可能です。