Heim >PHP-Framework >Laravel >Erweiterte Implementierung der Laravel-Berechtigungsfunktion: So erreichen Sie die Isolierung mehrerer Mandanten
Erweiterte Implementierung der Laravel-Berechtigungsfunktion: Für die Implementierung der mehrinstanzenfähigen Berechtigungsisolierung sind spezifische Codebeispiele erforderlich.
Mit der rasanten Entwicklung des Internets stellen Unternehmen immer mehr Anforderungen an Online-Anwendungen. In diesen Anwendungen sind mandantenfähige Systeme zu einem gängigen Architekturmuster geworden. Multi-Tenant-Systeme ermöglichen es mehreren Mandanten (Unternehmen, Institutionen oder Einzelpersonen), eine Anwendung gemeinsam zu nutzen, ihre Daten und Vorgänge sind jedoch voneinander isoliert.
Berechtigungsisolation ist ein sehr wichtiges Thema bei der Verwendung des Laravel-Frameworks zur Entwicklung eines mandantenfähigen Systems. In diesem Artikel wird erläutert, wie die Berechtigungsisolierung in einem System mit mehreren Mandanten mithilfe der Berechtigungsfunktion von Laravel implementiert wird, und es werden spezifische Codebeispiele aufgeführt.
Zuerst müssen wir das Konzept der Mehrfachmieter definieren, das durch ein Mietermodell dargestellt werden kann. In Laravel können wir dazu Eloquent-Modelle verwenden. Hier ist ein einfaches Beispiel für ein Mietermodell:
<?php namespace AppModels; use IlluminateDatabaseEloquentModel; class Tenant extends Model { protected $guarded = []; // 租户和用户之间的关联关系 public function users() { return $this->hasMany(User::class); } }
Als nächstes müssen wir für jeden Mieter eine unabhängige Datenbank erstellen und mehrere Datenbankverbindungen in Laravel konfigurieren. Wir können diese Datenbankverbindungen in der Konfigurationsdatei config/database.php wie folgt definieren:
<?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, ], ], // ... ];
In der obigen Konfigurationsdatei haben wir eine Datenbankverbindung mit dem Namen „tenant“ hinzugefügt und die entsprechende Verbindung in der .env-Datei konfiguriert. Die Informationen lauten wie folgt:
TENANT_DB_HOST=127.0.0.1 TENANT_DB_PORT=3306 TENANT_DB_DATABASE=tenant_db TENANT_DB_USERNAME=root TENANT_DB_PASSWORD=secret
Als nächstes müssen wir in Laravel eine Middleware definieren, um die Isolierung von mandantenfähigen Berechtigungen zu implementieren. Mithilfe von Middleware können wir Anfragen abfangen und feststellen, ob der angeforderte Mandant mit dem Mandanten übereinstimmt, zu dem der aktuell angemeldete Benutzer gehört, und so eine Berechtigungsisolierung erreichen. Das Folgende ist ein einfaches Middleware-Beispiel:
<?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'); } }
Im obigen Beispiel erhalten wir zunächst die Informationen des aktuell angemeldeten Benutzers über die Methode Auth::user() und ermitteln, ob der Mandant, zu dem der Benutzer gehört, mit dem angeforderten übereinstimmt Mieter; wenn er nicht übereinstimmt, wird ein 403-Fehler zurückgegeben. Anschließend wechseln wir über die Methode switchConnection() zur Datenbankverbindung des entsprechenden Mandanten.
Abschließend müssen wir die Middleware in der Routing-Datei registrieren und das entsprechende Routing-Beispiel hinzufügen:
<?php use IlluminateSupportFacadesRoute; // ... Route::group(['middleware' => ['auth', 'tenant']], function () { Route::get('/dashboard', [DashboardController::class, 'index']); Route::get('/reports', [ReportsController::class, 'index']); });
Im obigen Beispiel haben wir zwei Middleware registriert: Auth wird zur Überprüfung des Benutzeranmeldestatus verwendet, und Tenant wird zur Ausführung verwendet Isolierung mehrerer Mandantenberechtigungen. Wir können die Informationen des aktuell angemeldeten Benutzers erhalten, indem wir die Methode Auth::user() aufrufen und in der Middleware ein Urteil fällen.
Das Obige sind die grundlegenden Ideen und Codebeispiele für die Implementierung der mehrinstanzenfähigen Berechtigungsisolierung. Natürlich können tatsächliche Anwendungsszenarien komplexer sein und entsprechende Anpassungen und Erweiterungen basierend auf den tatsächlichen Bedürfnissen erfordern. In jedem Fall können wir jedoch die leistungsstarken Berechtigungsfunktionen und den Middleware-Mechanismus von Laravel verwenden, um eine Berechtigungsisolierung in mandantenfähigen Systemen zu erreichen und so die Unabhängigkeit und Sicherheit der Daten zwischen verschiedenen Mandanten sicherzustellen.
Das obige ist der detaillierte Inhalt vonErweiterte Implementierung der Laravel-Berechtigungsfunktion: So erreichen Sie die Isolierung mehrerer Mandanten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!