Pelaksanaan lanjutan fungsi kebenaran Laravel: Cara melaksanakan pengasingan kebenaran berbilang penyewa memerlukan contoh kod khusus
Dengan perkembangan pesat Internet, perusahaan mempunyai lebih banyak permintaan untuk aplikasi dalam talian. Dalam aplikasi ini, sistem berbilang penyewa telah menjadi corak seni bina yang biasa. Sistem berbilang penyewa membenarkan berbilang penyewa (perusahaan, institusi atau individu) berkongsi aplikasi, tetapi data dan operasi mereka diasingkan antara satu sama lain.
Pengasingan kebenaran merupakan isu yang sangat penting apabila menggunakan rangka kerja Laravel untuk membangunkan sistem berbilang penyewa. Artikel ini akan memperkenalkan cara melaksanakan pengasingan kebenaran dalam sistem berbilang penyewa melalui fungsi kebenaran Laravel dan memberikan contoh kod khusus.
Pertama, kita perlu mentakrifkan konsep berbilang penyewa, yang boleh diwakili oleh model penyewa. Dalam Laravel, kita boleh menggunakan model Eloquent untuk mencapai ini. Berikut ialah contoh model penyewa mudah:
<?php namespace AppModels; use IlluminateDatabaseEloquentModel; class Tenant extends Model { protected $guarded = []; // 租户和用户之间的关联关系 public function users() { return $this->hasMany(User::class); } }
Seterusnya, kita perlu mencipta pangkalan data bebas untuk setiap penyewa dan mengkonfigurasi berbilang sambungan pangkalan data dalam Laravel. Kami boleh mentakrifkan sambungan pangkalan data ini dalam fail konfigurasi config/database.php seperti berikut:
<?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, ], ], // ... ];
Dalam fail konfigurasi di atas, kami menambah sambungan pangkalan data bernama penyewa dan mengkonfigurasi sambungan yang sepadan dalam fail .env Maklumat adalah seperti berikut:
TENANT_DB_HOST=127.0.0.1 TENANT_DB_PORT=3306 TENANT_DB_DATABASE=tenant_db TENANT_DB_USERNAME=root TENANT_DB_PASSWORD=secret
Seterusnya, kita perlu menentukan perisian tengah dalam Laravel untuk melaksanakan pengasingan kebenaran berbilang penyewa. Kami boleh menggunakan perisian tengah untuk memintas permintaan dan menentukan sama ada penyewa yang diminta sepadan dengan penyewa yang dimiliki oleh pengguna yang sedang log masuk, dengan itu mencapai pengasingan kebenaran. Berikut ialah contoh middleware yang mudah:
<?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'); } }
Dalam contoh di atas, kami mula-mula mendapatkan maklumat pengguna yang sedang log masuk melalui kaedah Auth::user() dan menentukan sama ada penyewa yang menjadi milik pengguna sepadan dengan yang diminta. penyewa; jika ia tidak sepadan, ralat 403 dikembalikan. Kemudian, kami bertukar kepada sambungan pangkalan data penyewa yang sepadan melalui kaedah switchConnection().
Akhir sekali, kami perlu mendaftarkan middleware dalam fail penghalaan dan menambah contoh penghalaan yang sepadan:
<?php use IlluminateSupportFacadesRoute; // ... Route::group(['middleware' => ['auth', 'tenant']], function () { Route::get('/dashboard', [DashboardController::class, 'index']); Route::get('/reports', [ReportsController::class, 'index']); });
Dalam contoh di atas, kami mendaftarkan dua middleware: auth digunakan untuk mengesahkan status log masuk pengguna, dan penyewa digunakan untuk melaksanakan pengasingan kebenaran Penyewa berbilang. Kami boleh mendapatkan maklumat pengguna yang sedang log masuk dengan memanggil kaedah Auth::user() dan membuat pertimbangan dalam middleware.
Di atas ialah idea asas dan contoh kod untuk melaksanakan pengasingan kebenaran berbilang penyewa. Sudah tentu, senario aplikasi sebenar mungkin lebih kompleks dan memerlukan pelarasan dan pengembangan yang sepadan berdasarkan keperluan sebenar. Tetapi dalam apa jua keadaan, kami boleh menggunakan fungsi kebenaran Laravel yang berkuasa dan mekanisme perisian tengah untuk mencapai pengasingan kebenaran dalam sistem berbilang penyewa untuk memastikan kebebasan dan keselamatan data antara penyewa yang berbeza.
Atas ialah kandungan terperinci Pelaksanaan lanjutan fungsi kebenaran Laravel: cara mencapai pengasingan kebenaran berbilang penyewa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!