2016-12-20 4 views
0

So versuche ich die Rolle eines Benutzers beim Zugriff auf die Web-App beim Einloggen zu überprüfen. Ich habe eine users table, roles table, und ein role_users tableAufruf zu undefinierter Methode Illuminate Database Query Builder :: hasAnyRole() Fehler auf Laravel 5.3

Benutzer Tabelle -------- | Benutzer-ID | andere wichtige Felder |

Rollen Tabelle -------- | role_id | role_desc |

role_users Tabelle --- | role_id | Benutzer-ID |


User.php Modell

class User extends Model implements Authenticatable{ 

    use \Illuminate\Auth\Authenticatable; 

    public function roles(){ 
     return $this->belongsToMany('App\Role', 'role_users', 'user_id', 'role_id'); 
    } 

    public function hasAnyRole($roles){ 
     if (is_array($roles)) { 
      foreach ($roles as $role) { 
       if ($this->hasRole($role)) { 
        return true; 
       } 
      } 
     } else { 
      if ($this->hasRole($roles)) { 
       return true; 
      } 
     } 
     return false; 
    } 



    public function hasRole($role){ 
     if ($this->roles()->where('role_desc', $role)->first()) { 
      return true; 
     } 
     return false; 
    } 
} 

Role.php Modell

class Role extends Model{ 

    public function users(){ 
     return $this->belongsToMany('App\User','role_users', 'role_id', 'user_id'); 
    } 
} 

Hier ist meine Route Datei

Route::group(['middleware' => 'web'], function() { 
    Route::get('/{id}',[ 
     'uses' => '[email protected]', 
     'as' => 'dashboard', 
     'middleware' => 'roles', 
     'roles' => ['Superadmin', 'Admin', 'Author', 'Editor'] 
    ]); 
}); 

I CheckRole.php (bereits definiert in der Kernel-Datei)

class CheckRole 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     if ($request->user() === null) { 
      return response("Insufficient permissions", 401); 
     } 

     $actions = $request->route()->getAction(); 
     $roles = isset($actions['roles']) ? $actions['roles'] : null; 

     if ($request->user()->hasAnyRole($roles) || !$roles) { 
      return $next($request); 
     } 
     return response("Insufficient permissions", 401); 
    } 
} 

DAS PROBLEM auch diese Middleware-Datei haben,: Ich erhalte diese „Call to undefined Methode Illuminate \ Database \ Query \ Builder :: hasAnyRole() "(überprüft, ob die Route für ein Array von Rollen zugänglich ist), aber wie Sie sehen können, ist es in meinem User.php-Modell definiert.

Ich habe versucht, alle Zeilen aus der hasAnyRole function kommentieren und einfach nur eine Zeichenfolge aussprechen, aber der Fehler bleibt bestehen.

Mit print_r($roles) in der CheckRole.php Datei zeigt die korrekte Anordnung von Rollen in meiner Route.

Ich vermute, bin es ist wegen der id Parameter in meiner Route. Aber ich habe wirklich keine Ahnung, wie ich das reparieren soll.

ich denke, die Fehler aus der Datei CheckRole.php passiert. Kann jemand darauf hinweisen, was ich hier falsch gemacht habe?

+0

Als eine Randnotiz könnten Sie wirklich diese Funktion vereinfachen, indem Sie 'whereIn' verwenden:' $ this-> roles() -> whereIn ('role_desc', $ roles) -> firstOrFail() ' – Ohgodwhy

Antwort

0

Ich denke, der einzige Grund, warum es scheitern könnte, ist, wenn Sie anderes Modell verwenden für die Authentifizierung als User Modell, bevor Sie zeigte.

Wenn in config/auth.php I Modell gesetzt dieses Modell zu kopieren:

'providers' => [ 
    'users' => [ 
     'driver' => 'eloquent', 
     'model' => App\Models\User2::class, 
    ], 
], 

, die nicht hasAnyRole Methode hat Ich habe genau die gleiche Fehlermeldung anzeigt:

Call to undefined method Illuminate\Database\Query\Builder::hasAnyRole()

So sollten Sie sicherstellen, Dieses Benutzermodell, das Sie oben gezeigt haben, wird wirklich zur Authentifizierung verwendet.

+1

Sie haben Recht.Das liegt daran, dass ich Laravels Auth-Funktionen benutzt habe. Meine 'config/auth.php' ist mit dem' Login-Modell' anstatt mit dem 'Benutzermodell' verbunden. Ein paar Optimierungen brachten mich dazu, die Auth-Funktion mit der Rollenüberprüfung zu verwenden. Vielen Dank! – Eggnog654

Verwandte Themen