Skip to content

ミドルウェア

Lase が提供するミドルウェアの一覧です。LaseServiceProvider によって自動登録されます。

IdentifyTenant

エイリアス: tenant

テナント API のすべてのルートに適用されます。サブドメインからテナントを識別し、リクエストにテナントオブジェクトをセットします。

動作

  1. ルートパラメータ tenantCode(サブドメイン)を取得
  2. Cache::remember("tenant:{code}", 60min) でテナントを取得
  3. テナントが存在しない場合は 404 NotFound を返す
  4. $request->attributes->set('tenant', $tenant) でテナントをセット
  5. ルートパラメータから tenantCode を削除

コントローラでの使い方

php
public function index(Request $request)
{
    $tenant = $request->attributes->get('tenant');
    // または
    $tenant = app('tenant'); // アプリ側でバインドしている場合
}

Authorize

エイリアス: authorize

ログイン中のユーザーがリクエストされたコンテキスト(admin または tenant)に属するかを検証します。

php
Route::middleware(['auth', 'authorize:admin'])->group(function () { ... });
Route::middleware(['auth', 'authorize:tenant'])->group(function () { ... });

検証ロジックは AuthorizerRegistry に登録された Authorizer が担います。

カスタム Authorizer の登録

AppServiceProvider などで独自の Authorizer を登録できます。

php
use CodebaseJp\Lase\Auth\AuthorizerRegistry;

public function boot(AuthorizerRegistry $registry): void
{
    $registry->register('admin', new MyCustomAdminAuthorizer());
}

EnsureTenantPermission

エイリアス: tenant.can

ログイン中のテナントユーザーが、指定した権限(TenantPermission)を持っているかを検証します。持っていない場合は 403 Forbidden を返します。

php
Route::middleware(['auth', 'authorize:tenant'])->group(function () {
    Route::middleware('tenant.can:contract:read')->group(function () {
        Route::resource('plans', PlanController::class)->only(['index', 'show']);
    });

    // 複数指定した場合はいずれかを持っていれば通す
    Route::middleware('tenant.can:setting:read,setting:write')->get('setting', [SettingController::class, 'show']);
});

注意

  • 権限のコンテキストは自分で用意するため、authorize:tenant との順序に依存しません(先に走っていれば何もしません)。テナントのメンバーでない場合は authorize:tenant と同じく 403 Forbidden になります。
  • 権限の値は config('lase.enums.tenant_permission')(アプリ側の Enum)→ Lase の TenantPermission の順に解決します。どちらにも定義されていない値を指定すると InvalidArgumentException になります。
  • 判定は User::hasTenantPermission() に委譲するため、*(全権限)を持つ役割はすべて通ります。
  • 拒否は Illuminate\Auth\Access\AuthorizationException(未ログインは Illuminate\Auth\AuthenticationException)で投げるため、ポリシーによる拒否と同じ経路でハンドリングされます。

RestrictTenantIpAddress

エイリアス: tenant.restrict_ip

テナント API のすべてのルートに適用されます。テナントごとに許可 IP を設定でき、リスト外からのアクセスを 403 Forbidden で拒否します。

  1. TenantAllowedIp テーブルの CIDR レコードを Cache::remember("tenant:{code}:allowed_ips", 60min) で取得
  2. レコードが存在しない場合は制限なし(全 IP 許可)
  3. CIDR 表記(例: 203.0.113.0/24)と単一 IP の両方に対応
  4. 拒否時は 403 Forbidden を返し、警告ログを記録

テナントに TenantAllowedIp レコードを登録することで制限が有効になります。レコードが1件もなければ制限は無効です。

RestrictIpAddress

エイリアス: restrict_ip

config('lase.ip_restriction.enabled')true の場合に、ホワイトリスト外の IP アドレスからのアクセスを 403 Forbidden で拒否します。

設定

dotenv
IP_RESTRICTION_ENABLED=true
IP_RESTRICTION_ALLOWLIST=203.0.113.1,203.0.113.2

管理画面ルートにのみ適用することを推奨します。

php
Route::middleware(['restrict_ip'])->group(function () {
    // 管理者向けルート
});