Implémentation avancée de la fonction d'autorisation de Laravel : comment implémenter l'isolation des autorisations multi-locataires nécessite des exemples de code spécifiques
Avec le développement rapide d'Internet, les entreprises ont de plus en plus de demandes d'applications en ligne. Dans ces applications, les systèmes multi-locataires sont devenus un modèle architectural courant. Les systèmes multi-locataires permettent à plusieurs locataires (entreprises, institutions ou particuliers) de partager une application, mais leurs données et opérations sont isolées les unes des autres.
L'isolation des autorisations est un problème très important lors de l'utilisation du framework Laravel pour développer un système multi-tenant. Cet article explique comment implémenter l'isolation des autorisations dans un système multi-tenant via la fonction d'autorisation de Laravel et donne des exemples de code spécifiques.
Tout d'abord, nous devons définir la notion de locataires multiples, qui peut être représentée par un modèle de locataire. Dans Laravel, nous pouvons utiliser des modèles Eloquent pour y parvenir. Voici un exemple simple de modèle de locataire :
<?php namespace AppModels; use IlluminateDatabaseEloquentModel; class Tenant extends Model { protected $guarded = []; // 租户和用户之间的关联关系 public function users() { return $this->hasMany(User::class); } }
Ensuite, nous devons créer une base de données indépendante pour chaque locataire et configurer plusieurs connexions à la base de données dans Laravel. Nous pouvons définir ces connexions à la base de données dans le fichier de configuration config/database.php comme suit :
<?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, ], ], // ... ];
Dans le fichier de configuration ci-dessus, nous avons ajouté une connexion à la base de données nommée locataire et configuré la connexion correspondante dans le fichier .env. Les informations sont les suivantes :
TENANT_DB_HOST=127.0.0.1 TENANT_DB_PORT=3306 TENANT_DB_DATABASE=tenant_db TENANT_DB_USERNAME=root TENANT_DB_PASSWORD=secret
Ensuite, nous devons définir un middleware dans Laravel pour implémenter l'isolation des autorisations multi-locataires. Nous pouvons utiliser un middleware pour intercepter les demandes et déterminer si le locataire demandé correspond au locataire auquel appartient l'utilisateur actuellement connecté, réalisant ainsi l'isolation des autorisations. Ce qui suit est un exemple simple de middleware :
<?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'); } }
Dans l'exemple ci-dessus, nous obtenons d'abord les informations de l'utilisateur actuellement connecté via la méthode Auth::user(), et déterminons si le locataire auquel appartient l'utilisateur correspond à celui demandé. tenant ; s’il ne correspond pas, une erreur 403 est renvoyée. Ensuite, nous passons à la connexion à la base de données du locataire correspondant via la méthode switchConnection().
Enfin, nous devons enregistrer le middleware dans le fichier de routage et ajouter l'exemple de routage correspondant :
<?php use IlluminateSupportFacadesRoute; // ... Route::group(['middleware' => ['auth', 'tenant']], function () { Route::get('/dashboard', [DashboardController::class, 'index']); Route::get('/reports', [ReportsController::class, 'index']); });
Dans l'exemple ci-dessus, nous avons enregistré deux middleware : auth est utilisé pour vérifier l'état de connexion de l'utilisateur et le tenant est utilisé pour effectuer Isolation des autorisations de plusieurs locataires. Nous pouvons obtenir les informations de l'utilisateur actuellement connecté en appelant la méthode Auth::user() et porter un jugement dans le middleware.
Ce qui précède présente les idées de base et des exemples de code pour implémenter l'isolation des autorisations multi-locataires. Bien entendu, les scénarios d’application réels peuvent être plus complexes et nécessiter des ajustements et des extensions correspondants en fonction des besoins réels. Mais dans tous les cas, nous pouvons utiliser les puissantes fonctions d'autorisation et le mécanisme middleware de Laravel pour obtenir une isolation des autorisations dans les systèmes multi-locataires afin de garantir l'indépendance et la sécurité des données entre les différents locataires.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!