Selaa lähdekoodia

Merge branch 'refs/heads/f-saas' into dev

peterguo 2 kuukautta sitten
vanhempi
säilyke
3f6dce57ed

+ 36 - 0
app/Http/Middleware/GetTenancyByUsername.php

@@ -0,0 +1,36 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Closure;
+use Illuminate\Http\Request;
+use Symfony\Component\HttpFoundation\Response;
+use App\Models\GlobalUser;
+
+class GetTenancyByUsername
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
+     */
+    public function handle(Request $request, Closure $next): Response
+    {
+        $username = $request->input('username');
+
+        if (!$username) {
+            $username = $request->header('X-Username');
+        }
+
+        if ($username && !$request->hasHeader('X-Tenant')) {
+            $user = GlobalUser::where('username', $username)->first();
+            if ($user) {
+                // 将租户 ID 添加到请求头 X-Tenant,交给 InitializeTenancyByRequestData::class 处理
+                $request->headers->set('X-Tenant', $user->tenant_id);
+            }
+        }
+
+        return $next($request);
+    }
+
+}

+ 20 - 0
app/Models/GlobalUser.php

@@ -0,0 +1,20 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+use Stancl\Tenancy\Contracts;
+use Stancl\Tenancy\Database\Concerns;
+class GlobalUser extends Model implements Contracts\Domain
+{
+    use Concerns\CentralConnection;
+
+    protected $table = 'global_users';
+    use HasFactory;
+
+    public function tenant()
+    {
+        return $this->belongsTo(config('tenancy.tenant_model'));
+    }
+}

+ 2 - 0
app/Providers/TenancyServiceProvider.php

@@ -4,6 +4,7 @@ declare(strict_types=1);
 
 namespace App\Providers;
 
+use App\Http\Middleware\GetTenancyByUsername;
 use Illuminate\Support\Facades\Event;
 use Illuminate\Support\Facades\Route;
 use Illuminate\Support\ServiceProvider;
@@ -131,6 +132,7 @@ class TenancyServiceProvider extends ServiceProvider
     protected function makeTenancyMiddlewareHighestPriority()
     {
         $tenancyMiddleware = [
+            GetTenancyByUsername::class,
             // Even higher priority than the initialization middleware
             Middleware\PreventAccessFromCentralDomains::class,
 

+ 31 - 0
database/migrations/2024_12_30_160201_create_global_users_table.php

@@ -0,0 +1,31 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     */
+    public function up(): void
+    {
+        Schema::create('global_users', function (Blueprint $table) {
+            $table->id();
+            $table->string('username')->unique()->nullable(false);
+            $table->string('tenant_id')->nullable(false);
+            $table->foreign('tenant_id')->references('id')->on('tenants')->onUpdate('cascade')->onDelete('cascade');
+            $table->softDeletes();
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::dropIfExists('global_users');
+    }
+};

+ 2 - 1
routes/api.php

@@ -1,5 +1,6 @@
 <?php
 
+use App\Http\Middleware\GetTenancyByUsername;
 use Illuminate\Support\Facades\Route;
 use App\Http\Controllers\API;
 use Stancl\Tenancy\Middleware\InitializeTenancyByDomain;
@@ -19,7 +20,7 @@ use Stancl\Tenancy\Middleware\PreventAccessFromCentralDomains;
 Route::middleware((function() {
     return [
         'domain' => [InitializeTenancyByDomain::class, PreventAccessFromCentralDomains::class],
-        'requestData' => [InitializeTenancyByRequestData::class, PreventAccessFromCentralDomains::class],
+        'requestData' => [GetTenancyByUsername::class, InitializeTenancyByRequestData::class, PreventAccessFromCentralDomains::class],
     ][config('tenancy.init_tenant_middleware', 'domain')];
 })())->group(function () {