2016-11-01 6 views
2

habe ich eine Politik in Laravel 5.3 mit diesen beiden Aktionen:Laravel Autorisierung über Middleware

class ProjectPolicy { 
    ... 
    public function index(User $user) 
    { 
     return true; 
    } 
    public function create(User $user) 
    { 
     return true; 
    } 
    ... 
} 

und dann habe ich versucht Genehmigung über die Route Gruppe Middleware zu machen:

Route::group(['middleware' => ['can:index,create,App\Project']], function() { 
    Route::resource('projects', 'ProjectController'); 
}); 

natürlich habe ich erstellt Projekt Modell und Controller korrekt, aber das Aufrufen von Index und Erstellen von Aktionen gibt immer 403 verbotene Antwort zurück. Wo ist das Problem?

Update:

einer der Aktionen von der Route Middleware zu entfernen, führt korrekte Antwort. so etwas wie diese:

Route::group(['middleware' => ['can:index,App\Project']], function() { 
    Route::resource('projects', 'ProjectController'); 
}); 
+0

Haben Sie versucht, einen zweiten Route :: group-Block mit der verbleibenden Aktion zu erstellen. Das wäre ... can: create, App \ Project ...? – Digitalis

+0

ja, funktioniert, aber die zweite Gruppe wird abhängig von der ersten Middleware-Ergebnis, und wenn die erste Middleware falsche Brüche zurückgeben ... –

+0

Vielleicht wird dies helfen. Es tut mir leid zu sagen, dass ich die Antwort nicht kenne. Einfach das Problem ein bisschen googeln: http://stackoverflow.com/questions/38580890/how-to-return-403-response-in-json-format-in-laravel-5-2 Viel Glück! – Digitalis

Antwort

1

die Dokumentation Blick durch die can Middleware eignet nicht wirklich selbst zu Ressourcen. Sie könnten mehrere Middleware-Aufrufe für die Gruppe verwenden, dies würde jedoch bedeuten, dass für die Verwendung alle Berechtigungen für den Zugriff auf die Routen erforderlich sind.

Ihre Alternativen sind:

$this->authorize(new App\Project) auf Ihre index und create Methoden in Ihrem Controller hinzufügen. Laravel wird mithilfe von Reflektion herausfinden, welche Richtlinie basierend auf der Methode, von der sie aufgerufen wird, verwendet wird.

Oder

Im __construct() Methode des Controllers können Sie verwenden:

$this->authorizeResource(App\Project::class); 

Dadurch werden Sie auf benötigen update, view und delete Methoden in Ihrer Richtlinien Klasse erstellen. Jede dieser Methoden wird User $user, Project $project, z.B.

public function view(User $user, Project $project) 
{ 
    return true; 
} 

FYI, wenn Sie den Namen der Methode mit authorize() weglassen oder Sie verwenden authorizeResource() Laravel werden bestimmte Methodennamen zu verschiedenen politischen Methoden abzubilden, dh:

[ 
    //ControllerMethod => PolicyMethod 
    'show' => 'view', 
    'create' => 'create', 
    'store' => 'create', 
    'edit' => 'update', 
    'update' => 'update', 
    'destroy' => 'delete', 
]; 

Sie diese durch Hinzufügen eines resourceAbilityMap() Methode außer Kraft setzen können zu Ihrem Controller und ein anderes Array an das obige zurückgeben.

Hoffe, das hilft!

+0

großartig, danke für deine Hilfe :) –

+0

Danke dafür. Ich bin mir nicht sicher, warum die Methode AuthorizesRequests :: authorizeResource nicht dokumentiert ist. Es sollte sicherlich sein! – hackel

+0

@hackel Es gibt ein paar Dinge, die in der Dokumentation fehlen. Du könntest immer ein Problem im Github Repo erstellen oder sie selbst aufschreiben und dann eine Pull-Anfrage erstellen :) –