2016-04-06 11 views
2

Ich baue eine SaaS-App in Laravel und möchte jeder Person/Firma eine eigene Subdomain geben. Ich habe eine users Tabelle mit einer company_id Spalte. Ich habe eine companies Tabelle mit einer sub_domain Spalte, die die Subdomain für diese Firma sein wird. Ich möchte nicht, dass Firma A die Unterdomäne von Firma B besuchen kann.Multi-Tenant-Subdomains in Laravel 5

Ich habe eine ganze Reihe von Artikeln und viele Foren gelesen, wie man damit umgeht, und ich finde keine Lösungen, die funktionieren. Ich denke, dass ich Middleware in Kombination mit Routengruppierung verwenden muss, aber ich kann es einfach nicht herausfinden. Hat jemand Erfahrung damit?

Hier ist meine routes.php:

Route::group(['domain' => '{sub_domain}.' . env('APP_DOMAIN_NAME'), 'middleware' => 'subdomain'], function() { 

    Route::auth(); 

    Route::group(['middleware' => 'guest'], function() { 
     //Route::get('/', '[email protected]'); 
     Route::get('/tickets/create', '[email protected]'); 
     Route::post('/tickets/create', '[email protected]'); 
    }); 

    Route::group(['middleware' => 'auth'], function() { 
     Route::get('/tickets', '[email protected]'); 
     Route::get('/tickets/{id}', '[email protected]'); 
     Route::patch('/tickets/{id}', '[email protected]'); 
     Route::delete('/tickets/{id}', '[email protected]'); 
     Route::get('/my-tickets', '[email protected]'); 
     Route::get('/tickets/close/{id}', '[email protected]'); 

    }); 
}); 

Das Problem dabei ist, dass ich erfolgreich einen anderen Sub-Domain besuchen können. Jetzt kann ich nur noch die Tickets anzeigen, die mit der Firma des aktuell angemeldeten Benutzers verknüpft sind. Ich würde gerne eine 403 werfen oder einfach nur zurück in ihre eigene Subdomain umleiten. Hier

ist die Subdomain.php Middleware:

public function handle($request, Closure $next) 
{ 
    $request_uri = $request->server('HTTP_HOST'); 
    $this->checkSubdomainExists($request_uri); 

    if(Auth::check()) { 
     $user = User::find(Auth::user()->id); 
     if($user->company->sub_domain !== Session::get('company_sub_domain')) { 
      Session::forget('company_sub_domain'); 
      return 'not Authed'; 
     } 
    } 

    return $next($request); 
} 

Antwort

3

Diese Middleware arbeiten sollte.

public function handle($request, Closure $next) 
{ 
    if(Auth::check()) { 
     $user = Auth::user(); 
     $sub_domain = array_shift((explode(".",$_SERVER['HTTP_HOST']))); 
     if($user->company->sub_domain != $sub_domain) return abort(403); 

    } 

    return $next($request); 
} 

Aber Achtung, wenn das Unternehmen nicht angemeldet ist, kann es die Domäne sehen.

+0

Geck !!! Vielen Dank! Also, jetzt muss ich nur eine Überprüfung für eine gültige Sub-Domain und nicht authentifizierte Benutzer hinzufügen. – dericcain

0

Sitzungen in Laravel können für eine Domäne spezifisch sein, sodass Sie diese Funktion mit der aktuellen Unterdomäne verwenden können.

In der Sitzungskonfigurationsdatei:

'domain' => (!empty($_SERVER['HTTP_HOST'])) ? $_SERVER['HTTP_HOST'] : null,