2017-09-13 2 views
0

Ich habe drei Arten von Benutzern für die Anwendung, jeder hat seine eigenen dashboard. Ich brauche eine Überprüfung, dass ein anderer Benutzer kein anderes Benutzer-Dashboard sehen kann.Laravel Redirect Wenn authentifizierte Middleware

Es ist eine Middleware RedirectIfAuthenticated:

public function handle($request, Closure $next, $guard = null){ 

    if (Auth::guard($guard)->check() && auth()->user()->type == 'admin'){ 
     return redirect('/admin'); 
    } 

    if (Auth::guard($guard)->check() && auth()->user()->type == 'author'){ 
     return redirect('/author'); 
    } 

    if (Auth::guard($guard)->check() && auth()->user()->type == 'client'){ 
     return redirect('/client'); 
    } 
} 

Seine unter guest Middleware.

Der obige Code scheint mir gut aber wenn ich es teste, sagt der Browser Too many redirects.

Was mache ich falsch, was wird der beste Weg, damit umzugehen.

+0

Haben Sie nicht eine der Antworten gearbeitet? –

+0

@BasheerAhmedKharoti Nein, keiner funktioniert – Gammer

+0

Kannst du den Routencode einfügen? –

Antwort

1

Sie haben möglicherweise den Zweck dieser Middleware missverstanden. Der Zweck von RedirectIfAuthenticated besteht darin, einen Benutzer auf seine standardmäßige authentifizierte Seite umzuleiten. Es ist nicht dazu gedacht, nicht authentifizierte/nicht autorisierte Benutzer daran zu hindern, auf bestimmte Bereiche zuzugreifen.

Was Sie tun müssen, ist Redirect, wenn nicht autorisiert. Da dies ein einfacher Fall ist, können Sie nur eine Middleware haben:

class RequireRole { 
    public function handle($request, Closure $next, $role) { 
      abort_unless(auth()->check() && auth()->user()->type == $role, 403, "You don't have permissions to access this area"); 
      return $next($request); 
    } 
} 

Dann diese Middleware registrieren in Ihrem Kernel.php

protected $routeMiddleware = [ 
     //Other middleware 
     "requirerole" => RequireRole::class 
]; 

Dann können Sie es in Ihre Routen verwenden z.B.

Route::get('/admin', function() { /* action */ })->middleware("requirerole:admin"); 

Allerdings, wenn Sie sich in der Notwendigkeit komplexer Regeln finden dann werfen Sie einen Blick auf Authorization

+0

Perfect ........ – Gammer

0

Notwendigkeit, den Code ein wenig zu modifizieren

public function handle($request, Closure $next, $guard = null){ 

     if (Auth::guard($guard)->check() && auth()->user()->type == 'admin'){ 
      return redirect('/admin'); 
     } 

     if (Auth::guard($guard)->check() && auth()->user()->type == 'author'){ 
      return redirect('/author'); 
     } 

     if (Auth::guard($guard)->check() && auth()->user()->type == 'client'){ 
      return redirect('/client'); 
     } 
     return $next($request); 
} 
0

Sie haben eine zusätzliche Überprüfung für alle hinzufügen, wenn Aussage zu sehen, wenn Sie nicht bereits auf dem Weg sind, wo es zu

umleiten los Vielleicht so etwas wie:

&& $request->is('admin') 
0

einfach teilen Sie Ihre Schecks und halten die ursprüngliche Rückkehr:

 public function handle($request, Closure $next, $guard = null){ 
      if (Auth::guard($guard)->check()){ 

       if(Auth::user()->type == 'admin'){ 
        return redirect('/admin'); 
       } 
       if(Auth::user()->type == 'author'){ 
        return redirect('/author'); 
       } 
       if(Auth::user()->type == 'client'){ 
        return redirect('/client'); 
       } 
      } 
      return $next($request); 
    } 
+0

Gleiches Problem ...... – Gammer

+0

@Gammer aaron Zustand ist in Ordnung Wenn Sie nicht Gast Middleware über eine dieser Routen 'Admin, Autor und Client' haben .. –