2016-03-22 3 views
0

ich ein Tutorial bin nach einer Zugriffsebene Beschränkung für die Herstellung:Laravel Middleware funktioniert nicht auf eine Ressource Route

https://gist.github.com/amochohan/8cb599ee5dc0af5f4246

ich in der Lage war, um es irgendwie funktioniert, aber es ist etwas, was ich brauche zum Laufen zu bringen, das ist nicht im Tutorial.

Vorausgesetzt, ich habe das Tutorial gefolgt. Ich habe Setup diese Ressource Route:

Route::group(['middleware' => ['auth', 'roles'], 'roles' => ['Administrator']], function() 
{ 
    Route::resource('changeschedule', 'ChangeScheduleController', ['only' => ['index'], 'except' => ['create']]); 
}); 

Also, was ich wollte nur, um die roles Middleware auf eine Ressource Route gelten, aber mit bestimmten Route in dieser Ressource nur sagen wir, ich will ich nur in der index angewendet werden, so habe diese Route oben.

Wenn ich auf:

http://localhost/hrs/public/changeschedule 

Es funktioniert gut und die Middleware roles funktioniert gut. Aber warum das ist, wenn ich gehe:

http://localhost/hrs/public/changeschedule/create 

Ich erhalte

NotFoundHttpException in RouteCollection.php line 161: 

So habe ich ein nicht gefunden Streckenfehler. Warum das? Aber wenn ich

Route::group(['middleware' => ['auth', 'roles'], 'roles' => ['Administrator']], function() 
{ 
    Route::resource('changeschedule', 'ChangeScheduleController'); 
}); 

Dann funktioniert es gut, aber die Middleware wird auf alle angewendet:

index, create, update, edit, delete 

Ich will es nur in Index sein.

Mein Code:

Kernel.php

protected $routeMiddleware = [ 
    'auth'   => \App\Http\Middleware\Authenticate::class, 
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 
    'guest'   => \App\Http\Middleware\RedirectIfAuthenticated::class, 
    'roles'   => \App\Http\Middleware\CheckRole::class, 
]; 

CheckRole.php

<?php namespace App\Http\Middleware; 

use Closure; 

class CheckRole{ 

    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 

    public function handle($request, Closure $next) 
    { 
     // Get the required roles from the route 
     $roles = $this->getRequiredRoleForRoute($request->route()); 
     // Check if a role is required for the route, and 
     // if so, ensure that the user has that role. 
     if($request->user()->hasRole($roles) || !$roles) 
     { 
      return $next($request); 
     } 
     return response([ 
      'error' => [ 
       'code' => 'INSUFFICIENT_ROLE', 
       'description' => 'You are not authorized to access this resource.' 
      ] 
     ], 401); 
    } 

    private function getRequiredRoleForRoute($route) 
    { 
     $actions = $route->getAction(); 
     return isset($actions['roles']) ? $actions['roles'] : null; 
    } 
} 

Antwort

0

Sie können diese versuchen, eine Konstruktorfunktion erstellen und die Middleware von dort hinzufügen, zum Beispiel:

public function __construct() 
{ 
    $this->middleware('auth'); 

    $this->middleware('roles:administrator', ['only' => ['index']]); 
} 

Lesen Sie die documentation.

Update (Der dritte Parameter in der Middleware :: handle Methode kann das Argument):

public function handle($request, Closure $next, $role) 
{ 
    // $role will catch the administrator or whatever you pass 
} 

Sie können auch diese examples/tutorials auf meinem Blog prüfen (über Middleware).

+0

Hallo danke. Ich habe vergessen zu erwähnen, dass ich es schon versucht habe. Funktioniert nicht. Wenn ich das tue, scheint die Rollen-Middleware nicht zu funktionieren. Vielleicht, weil wir den für diese Middleware erlaubten Zugriff wie 'roles' => ['Administrator'] angeben müssen? – jackhammer013

+0

Überprüfen Sie die aktualisierte Antwort. –

+0

Immer noch nicht funktioniert, ich habe sogar versucht, $ this-> Middleware ('Rollen', ['nur' => ['index'], 'Rollen' => ['Administrator']]); und nicht so gut. – jackhammer013

Verwandte Themen