2017-10-24 1 views
2

ich dieses Setup haben: -Laravel Autorisierungsrichtlinie AccessDeniedHttpException Diese Aktion ist nicht autorisierte

\ App \ Policies \ ObservationPolicy

<?php 

namespace App\Policies; 

use App\Observation; 
use App\User; 
use Illuminate\Auth\Access\HandlesAuthorization; 

class ObservationPolicy 
{ 
    use HandlesAuthorization; 

    /** 
    * Create a new policy instance. 
    * 
    * @return void 
    */ 
    public function __construct() 
    { 
     // 
    } 

    public function edit(User $user, Observation $observation) 
    { 
     return $user->id == $observation->user_id; 
    } 



} 

Auth Dienstleister:

<?php 

namespace App\Providers; 

use Illuminate\Support\Facades\Gate; 
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; 


class AuthServiceProvider extends ServiceProvider 
{ 
    /** 
    * The policy mappings for the application. 
    * 
    * @var array 
    */ 
    protected $policies = [ 
     'App\Model' => 'App\Policies\ModelPolicy', 
     'App\Observation' => 'App\Policies\ObservationPolicy' 
    ]; 

    /** 
    * Register any authentication/authorization services. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 
     $this->registerPolicies(); 

     // 
    } 
} 

Wenn ich in Sicht versucht Datei mit dieser Aussage: -

@can('edit', $observation) 
@endcan 

Es funktionierte ohne jedes Problem.

Aber wenn ich in der Steuerung verwendet:

public function edit($id,Observation $observation) 
    { 
     $this->authorize('edit', $observation); 
     return view('mypage'); 
    } 

es immer Fehler zurück: - AccessDeniedHttpException Aktion für nicht autorisierte

Die Route, die ich zugegriffen wird: - Strecke :: get (‘/Beobachtung/{id}/edit ',' ObservationController @ edit ');

Antwort

3

Sieht aus, als würden Sie die falschen Parameter in Ihrer Controller-Methode akzeptieren.

Die Route, die Sie definiert haben:

Route::get('/Observation/{id}/edit', '[email protected]'); 

wird entlang der $id passieren, aber ich denke, die Observation $observation wird gerade eine neue Instanz der Observation Klasse. Es ist passiert, weil Laravel denkt, dass Sie Dependency Injection in Ihrem Controller-Methode verwenden möchten: https://laravel.com/docs/5.5/controllers#dependency-injection-and-controllers

public function edit($id, Observation $observation): 

Statt versuchen, dies in Ihrer Route:

Route::get('/Observation/{observation}/edit', '[email protected]'); 

und dies als Methode Parameter:

public function edit(Observation $observation): 

Hier verwenden wir die Build-in-Funktion Route Modell zu tun Bindung: https://laravel.com/docs/5.5/routing#route-model-binding
Wenn Sie wollen auf dieser Magie nicht verlassen, würden Sie die tatsächliche Beobachtung in Ihrer Controller-Methode manuell, zum Beispiel finden müssen $observation = Observation::findOrFail($id);

+0

Das hat funktioniert, danke – user2873860

Verwandte Themen