2017-06-13 4 views
1

Es gibt diese Methode authorizeResource(), die bestimmte Richtlinien auf alle Routen (mit Ausnahme der Indexroute) anwendet. Gibt es eine Möglichkeit Richtlinien gelten nur auf bestimmten Strecken, die analog zu dieser Funktion:Nur bestimmte Routen einer Ressource autorisieren

Route::resource('photo', 'PhotoController', ['only' => [ 
    'index', 'show' 
]]); 
+2

Ich denke, Sie müssen Gates dafür verwenden (Schutz über Middleware) –

Antwort

0

Sie realistisch Middleware in der Steuerung definieren:

public PhotoController extends Controller { 
    public function __construct() { 
     $this->middleware("can:save,photo")->only(["save","edit"]); //You get the idea 
    } 
} 

Dies setzt voraus, Sie haben eine richtige Politik geschrieben (überprüfen Sie https://laravel.com/docs/5.4/authorization)

+0

Wie ich sehe, wird die Middleware nur passieren, wenn * beide * speichern und Foto weitergeben. 'authorizeResource()' jedoch wird die richtige Richtlinie zu jeder Route zuordnen (z.B. 'create()' zu 'create()' und 'store()'), oder liege ich falsch? – Elwin

+0

@Elwin tatsächlich 'can: action, photo' wird einen Parameter namens' $ photo' von der Aktion namens 'save' oder' edit' erhalten (je nachdem, welche aufgerufen wurde), dann wird es die Richtlinie finden, die auf Elemente von der Typ von $ photo (zB 'Photo') und eine Methode namens 'action (User $ user, Photo $ photo)' aus dieser Richtlinie anwenden. – apokryfos

+0

@Elwin check https://github.com/laravel/framework/blob /7d116dc5a008e69c97f864af79ac46ab6a8d5895/src/Illuminate/Foundation/Auth/Access/AuthorizesRequests.php#L82: authorizeResource bildet im Grunde einige Routennamen auf einige Aktionen ab, wie zum Beispiel die 'edit' Ressourcenroute zur 'update' Richtlinien-Aktion. Wenn Sie eine Teilmenge benötigen dann kann man sie wahrscheinlich einfach manuell machen – apokryfos

0

Ja, authorizeResource accepts an $options array as a third parameter. Übergeben Sie einfach null für das zweite Argument und die Syntax für Optionen ist die gleiche wie für Route Middleware.

public function __construct() 
{ 
    $this->authorizeResource(Photo::class, null, [ 
     'only' => ['create', 'store'], 
    ]); 
} 
+0

Das schien nicht für mich zu funktionieren. Ich betreibe Laravel 5.5 –

0

Trotz wies darauf hin, durch @JeffPucket in his answer, die only Option nicht für mich arbeiten. Ich bin mit Laravel 5.5 und was taten Arbeit war die inverse Logik:

public function __construct() 
{ 
    $this->authorizeResource(Photo::class, null, [ 
     'except' => [ 'index', 'show' ], 
    ]); 
} 

Beachten Sie, dass die Aktionen (Controller Methoden) zu dieser Option passieren sollten Sie nicht möchten, dass Ihre Politik anzuwenden. In diesem Fall umgehen index und show die Autorisierungs-Middleware.

Nur zum Vergleich, hier sind die Ergebnisse von php artisan route:list wenn jede Option:

nur

+--------+-----------+------------------------+-----------------+------------------------------------------------+--------------------------------------------------+ 
| Domain | Method | URI     | Name   | Action           | Middleware          | 
+--------+-----------+------------------------+-----------------+------------------------------------------------+--------------------------------------------------+ 
|  | POST  | comment    | comment.store | App\Http\Controllers\[email protected] | web,auth,can:create,App\Http\Controllers\Comment | 
|  | GET|HEAD | comment    | comment.index | App\Http\Controllers\[email protected] | web,auth,can:view,App\Http\Controllers\Comment | 
|  | GET|HEAD | comment/create   | comment.create | App\Http\Controllers\[email protected] | web,auth,can:create,App\Http\Controllers\Comment | 
|  | GET|HEAD | comment/{comment}  | comment.show | App\Http\Controllers\[email protected] | web,auth,can:view,comment      | 
|  | PUT|PATCH | comment/{comment}  | comment.update | App\Http\Controllers\[email protected] | web,auth,can:update,comment      | 
|  | DELETE | comment/{comment}  | comment.destroy | App\Http\Controllers\[email protected] | web,auth,can:delete,comment      | 
|  | GET|HEAD | comment/{comment}/edit | comment.edit | App\Http\Controllers\[email protected] | web,auth,can:update,comment      | 
+--------+-----------+------------------------+-----------------+------------------------------------------------+--------------------------------------------------+ 

außer

+--------+-----------+------------------------+-----------------+------------------------------------------------+--------------------------------------------------+ 
| Domain | Method | URI     | Name   | Action           | Middleware          | 
+--------+-----------+------------------------+-----------------+------------------------------------------------+--------------------------------------------------+ 
|  | POST  | comment    | comment.store | App\Http\Controllers\[email protected] | web,auth,can:create,App\Http\Controllers\Comment | 
|  | GET|HEAD | comment    | comment.index | App\Http\Controllers\[email protected]index | web,auth           | 
|  | GET|HEAD | comment/create   | comment.create | App\Http\Controllers\[email protected] | web,auth,can:create,App\Http\Controllers\Comment | 
|  | GET|HEAD | comment/{comment}  | comment.show | App\Http\Controllers\[email protected] | web,auth           | 
|  | PUT|PATCH | comment/{comment}  | comment.update | App\Http\Controllers\[email protected] | web,auth,can:update,comment      | 
|  | DELETE | comment/{comment}  | comment.destroy | App\Http\Controllers\[email protected] | web,auth,can:delete,comment      | 
|  | GET|HEAD | comment/{comment}/edit | comment.edit | App\Http\Controllers\[email protected] | web,auth,can:update,comment      | 
+--------+-----------+------------------------+-----------------+------------------------------------------------+--------------------------------------------------+ 

Wie Sie oben sehen können, die Middleware wird nur auf bestimmte Routen angewendet, wennverwendet wird.

Vielleicht ist dies ein Fehler im Framework. Aber es ist schwer zu bestätigen, da diese Option nicht dokumentiert zu sein scheint. Auch Details zu authorizeResource() Methode sind nicht vorhanden.

Verwandte Themen