2016-07-04 10 views
0

Ich versuche, ein Online-Shop Website-Framework Laravel mit dieser Spaltezwei Benutzer-Auth in einer einzigen Tabelle in Laravel 5.2

Ich habe eine Tabelle zu erstellen: id, username, password, division_id

wo division_id auf eine Tabelle bezieht genannt division mit: id, division_type

und ich habe zwei division type: Admin und Customers

ich bin Der Versuch, die Berechtigung zum Zugriff auf eine bestimmte Anzahl von Seiten auf der Grundlage ihrer division_id wie Admin kann Zugriff auf Admin-Panel, aber nicht Kunde, und der Kunde kann Kunden-Panel wie Produkt-Bestellseite, aber nicht Admin zugreifen.

Beide Arten können fast alles in ihren zugänglichen Seiten tun, und meine Hauptseiten werden ein Admin-Panel, ein Kunden-Panel und die Haupt-Website haben.

Wie kann ich das in meinem Projekt mit nur einer einzigen Tabelle und Middleware-Gruppe tun?

P.S. Ich bin neu in diesem Forum

+0

Was ist das Beziehungsszenario? 1 Benutzer gehört nur zu einer Abteilung? oder 1 Benutzer gehört zu vielen? –

+0

Ein Benutzer gehört zu einer Abteilung, eine Abteilung hat viele Benutzer. – Orange

+0

der richtige Weg sollte zwei Gruppenrouten mit Middleware haben, für Admin und Kunden – xmhafiz

Antwort

0

Für diese Middleware, müssen Sie nur überprüfen, ob die division erforderlich ist, um die Website anzuzeigen ist die gleiche wie die division, dass der Benutzer gehört. In der handle Funktion können Sie ein drittes Argument übergeben, die eine Teilung Namen, wie customer

Wenn Sie die Middleware auf Ihre Routen hinzufügen, können Sie den Namen der Abteilung repräsentiert als Argument an die handle Funktion wie so passieren können :

'middleware' => ['division:customer'] 

Implementierung dieser in einem Route Group etwas wie folgt aussehen:

Route::group(['prefix' => 'customer', 'middleware' => ['division:customer']], funtion(){ 
    //route definitions for all these routes will require a "division" type of "customer" 
}); 

Oder Sie könnten es fürzu routen Ressourcen einzufrierenRouting:

Route::resource('customer', 'CustomerController')->middleware(['divison:customer']); 

Oder Sie könnten es nur auf eine bestimmte Strecke gelten:

Route::get('customer/{id}', '[email protected]')->middleware(['division:customer']); 

In Ihrer handle Funktion Sie diesen Wert als das dritte Argument zugreifen:

public function handle($request, Closure $next, Division $division) 

zu Machen Sie den Prozess der automatischen Auflösung einer Abhängigkeit durch etwas anderes als den Primärschlüssel einfach, wir gehen voran und öffnen unsere App\Providers\RouteServiceProvider und fügen Sie etwas Magie innerhalb der boot Funktion hinzu.

public function boot(Router $router) 
{ 
    parent::boot($router); 

    $router->bind('division', function($value) { 
     return Division::where(function($query) use($value){ 
      if (is_int($value)) { 
       return $query->where('id', $value)->first(); 
      } else { 
       return $query->where('type', ucfirst($value))->first(); 
      } 

      return null; 
     }); 
    }); 

Nun, zurück an die Middleware, können wir leicht einen Vergleich gegen die $division in unserer handle Funktion machen, und unsere authorized Benutzer.

if(app()->user()->division->type == $division->type) { 
    return $next($request); 
} 

abort(403, 'You are not authorized to view this page!'); 
+0

Wie stellen wir "Middleware" => ['division: customer'] '? Können Sie mir ein Beispiel für diese Implementierung in routes.php zeigen? – Orange

+0

@Orange Sie würden dies auf Ihre 'Routen' anwenden. Höchstwahrscheinlich willst du eine Gruppe. Antwort aktualisiert – Ohgodwhy

+0

Route nicht gefunden. Ist es möglich, den Parameter 'division' an die ursprüngliche 'auth'-Middleware zu übergeben, ohne eine neue Middleware zu erstellen? – Orange