2016-12-17 2 views
2

In meinem Laravel 5.3-Setup verwende ich Bouncer Paket, und ich definierte zwei Rollen, admin und customer. Wenn Sie angemeldet sind, werden Kunden wie in protected $redirectTo = '/home'; unter App\Http\Controllers\Auth\LoginController.php angegeben zu /home umgeleitet. Wenn sich nun ein Benutzer mit der Rolle admin anmeldet, wird er auch umgeleitet, weil $redirectTo keine Unterscheidung zwischen Benutzerrollen macht. Mein Ziel ist es, Admin-Benutzer auf /admin/home stattdessen umzuleiten.Rollenbasiertes Routing in LoginController (Auth)

Was ist die beste Lösung, um damit umzugehen? Hier ist mein Versuch.

In web.php Routen, außerhalb jeder Middleware Gruppen:

Route::get('/home', function(Illuminate\Http\Request $request) { // http://myapp.dev/home 
    if (Auth::user()->isA('customer')) // -> goto [email protected] 
     return app()->make('\App\Http\Controllers\HomeController')->index($request); 
    else if (Auth::user()->isAn('admin')) // -> redirect 
     return redirect('/admin/home'); 
    else 
     abort(403); 
})->middleware('auth'); 

Route::group(['prefix' => 'admin','middleware' => 'auth'], function() { 
    Route::get('/home', 'Admin\[email protected]'); 
}); 

Alternativ kann dies kann auch in einer Middleware erfolgen:

Route::get('/home', '[email protected]')->middleware('auth', 'role'); 

// in VerifyRole.php middleware...  
public function handle($request, Closure $next, $guard = null) 
{ 
    if (Auth::user()->isAn('admin')) { 
     return redirect('/admin/home'); 
    } 

    return $next($request); 
} 

Dies funktionieren würde, aber es ist nicht skalierbar wenn mehr Rollen hinzugefügt werden. Ich bin sicher, dass es einen eleganten eingebauten Weg geben muss, um dies zu erreichen. Also die Frage ist, Wie route ich Benutzer zu ihrem richtigen Dashboard (d. H. home) basierend auf ihrer Rolle?

Antwort

2

können Sie überschreiben die authenticated() Methode in Ihrer Klasse App\Http\Controllers\Auth\LoginController als:

protected function authenticated(Request $request, $user) 
{ 
    if ($user->isA('customer')) 
     return redirect('/home'); 
    else if ($user->isAn('admin')) 
     return redirect('/admin/home'); 
} 

Oder

Sie können als die redirectPath() Methode überschreiben:

public function redirectPath() 
{ 
    if (auth()->user()->isA('customer')) 
     return '/home'; 
    else if (auth()->user()->isAn('admin')) 
     return '/admin/home'; 
} 
+0

Wird dies die eingebaute Logik, die diese Methoden standardmäßig enthalten, unterbrechen? – Alex

+0

Nein, es wird nichts brechen. –

+0

Ich will nicht unhöflich sein, aber könnten Sie bitte meine [andere Frage] (http://stackoverflow.com/questions/41201788/identifying-and-persisting-guest-users-in-laravel), es ist über die Identifizierung von Gastnutzern in Laravel. Danke im Voraus! – Alex

0

In Laravel 5.3 können Sie Override sendLoginResponse() Methode in AuthController.php um Benutzer zu einer anderen Routen umleiten zu können nach dem Login.