Laravel 権限機能の高度な実装: マルチテナント権限の分離を実装する方法、具体的なコード例が必要です
インターネットの急速な発展に伴い、企業にはさまざまな要求がありますオンライン申請がますます増えています。これらのアプリケーションでは、マルチテナント システムが一般的なアーキテクチャ パターンになっています。マルチテナント システムでは、複数のテナント (企業、機関、または個人) がアプリケーションを共有できますが、それらのデータと操作は相互に分離されています。
Laravel フレームワークを使用してマルチテナント システムを開発する場合、権限の分離は非常に重要な問題になります。この記事では、Laravelのパーミッション機能を利用してマルチテナントシステムでパーミッションの分離を実装する方法と、具体的なコード例を紹介します。
まず、テナント モデルで表すことができる複数のテナントの概念を定義する必要があります。 Laravel では、Eloquent モデルを使用してこれを実現できます。簡単なテナント モデルの例を次に示します。
<?php namespace AppModels; use IlluminateDatabaseEloquentModel; class Tenant extends Model { protected $guarded = []; // 租户和用户之间的关联关系 public function users() { return $this->hasMany(User::class); } }
次に、テナントごとに独立したデータベースを作成し、Laravel で複数のデータベース接続を構成する必要があります。これらのデータベース接続は、構成ファイル config/database.php で次のように定義できます。
<?php return [ // 默认数据库连接 'default' => env('DB_CONNECTION', 'mysql'), 'connections' => [ 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ], 'tenant' => [ 'driver' => 'mysql', 'host' => env('TENANT_DB_HOST', '127.0.0.1'), 'port' => env('TENANT_DB_PORT', '3306'), 'database' => env('TENANT_DB_DATABASE', 'forge'), 'username' => env('TENANT_DB_USERNAME', 'forge'), 'password' => env('TENANT_DB_PASSWORD', ''), 'unix_socket' => env('TENANT_DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ], ], // ... ];
上記の構成ファイルでは、tenant という名前のデータベース接続を追加し、.env ファイルで対応する接続情報を次のように構成します。
TENANT_DB_HOST=127.0.0.1 TENANT_DB_PORT=3306 TENANT_DB_DATABASE=tenant_db TENANT_DB_USERNAME=root TENANT_DB_PASSWORD=secret
次に、マルチテナント権限の分離を実装するために、Laravel でミドルウェアを定義する必要があります。ミドルウェアを使用してリクエストを傍受し、リクエストされたテナントが現在ログインしているユーザーが属しているテナントと一致するかどうかを判断することで、アクセス許可の分離を実現できます。以下は、単純なミドルウェアの例です。
<?php namespace AppHttpMiddleware; use Closure; use IlluminateSupportFacadesAuth; use IlluminateSupportFacadesDB; class TenantMiddleware { public function handle($request, Closure $next) { $tenantId = $request->route('tenantId'); $user = Auth::user(); if ($user && $tenantId != $user->tenant_id) { abort(403, 'Access denied.'); } $this->switchConnection($tenantId); return $next($request); } private function switchConnection($tenantId) { // 切换到对应租户的数据库连接 config(['database.connections.tenant.database' => "tenant_{$tenantId}"]); DB::purge('tenant'); } }
上記の例では、まず、現在ログインしているユーザーの情報を Auth::user() メソッドを通じて取得し、ユーザーが所属するテナントかどうかを判断します。所属は要求されたテナントと一致します。; 一致しない場合は、403 エラーが返されます。次に、switchConnection() メソッドを通じて、対応するテナントのデータベース接続に切り替えます。
最後に、ルーティング ファイルにミドルウェアを登録し、対応するルーティングの例を追加する必要があります:
<?php use IlluminateSupportFacadesRoute; // ... Route::group(['middleware' => ['auth', 'tenant']], function () { Route::get('/dashboard', [DashboardController::class, 'index']); Route::get('/reports', [ReportsController::class, 'index']); });
上の例では、2 つのミドルウェアを登録しました: ユーザーの認証に auth が使用されます。 ログイン ステータス、テナントはマルチテナント権限の分離に使用されます。 Auth::user()メソッドを呼び出すことで現在ログインしているユーザーの情報を取得し、ミドルウェアで判断することができます。
上記は、マルチテナントのアクセス許可の分離を実装するための基本的な考え方とコード例です。もちろん、実際のアプリケーション シナリオはより複雑になる可能性があり、実際のニーズに基づいて対応する調整や拡張が必要になる場合があります。しかし、いずれの場合でも、Laravel の強力な権限機能とミドルウェアメカニズムを使用して、マルチテナントシステムで権限の分離を実現し、異なるテナント間のデータの独立性とセキュリティを確保できます。
以上がLaravel パーミッション機能の高度な実装: マルチテナントのパーミッション分離を実現する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。