Rumah  >  Artikel  >  rangka kerja php  >  Pelaksanaan lanjutan fungsi kebenaran Laravel: cara mencapai pengasingan kebenaran berbilang penyewa

Pelaksanaan lanjutan fungsi kebenaran Laravel: cara mencapai pengasingan kebenaran berbilang penyewa

WBOY
WBOYasal
2023-11-02 16:35:181293semak imbas

Pelaksanaan lanjutan fungsi kebenaran Laravel: cara mencapai pengasingan kebenaran berbilang penyewa

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn