2016-05-28 12 views
0

Ich habe drei Rollen in meiner Anwendung. Ich habe eine Bedingung, in der zwei Rollen auf dieselbe Seite zugreifen können. Dafür schreibe ich unter Code.Gibt es überhaupt einen Code, so dass ich in der Middleware definieren oder konditionieren kann?

in unter Code, Subplan1 und Subplan 2 sind Rollen.

Wenn Subplan1, versucht, auf die Seite zuzugreifen, bekomme ich 404 Fehler, weil ich beide Middleware in der gleichen Gruppe erwähnt.

Gibt es sowieso Code so dass ich in Middleware definieren oder konditionieren kann?

+0

Sie könnten immer eine Middleware, die Parameter nimmt, dann übergeben Sie die "Rollen" als Parameter. – lagbox

Antwort

1

Für rollenbasierte Authentifizierung ich diese Middleware bin mit:

namespace App\Http\Middleware; 

use Auth; 
use Closure; 
use App\Role; 
use Illuminate\Support\Collection; 

class RoleMiddleware 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next, $roles = null, $guard = null) 
    { 
     $roles = Role::whereIn('slug', explode('|', $roles))->get(); 

     if (! Auth::guard($guard)->user()->hasRole($roles)) { 
      return abort(403, 'Forbidden'); 
     } 

     return $next($request); 
    } 
} 

registrieren Sie dann die Middleware in Kernel.php

'role' => \App\Http\Middleware\RoleMiddleware::class, 

Auf dem Benutzermodell stellen Sie sicher, Sie haben eine Methode Benutzer zu überprüfen, ob hat eine Reihe von Rollen, Beispiel:

public function hasRole($role) 
{ 
    if (is_int($role)) { 
     return $this->roles->contains('id', $role); 
    } 

    if (is_string($role)) { 
     return $this->roles->contains('slug', $role); 
    } 

    if ($role instanceof Model) { 
     return $this->roles->contains('id', $role->id); 
    } 

    return !! $role->intersect($this->roles)->count(); 
} 

Und Sie können die Middleware wie thi verwenden s:

Route::group(['middleware' => ['auth', 'role:admin|staff'], ...); 

Sie admin|staff mit Rollennamen ersetzen können, getrennt durch |. Wenn Sie benutzerdefinierte guard hinzufügen möchten, dann können Sie es als zweiter Parameter übergeben role:admin|staff,mycustomguard

Verwandte Themen