2016-07-26 10 views
7

Ich versuche eine RESTful API mit Laravel 5.2 zu entwickeln. Ich bin darüber gestolpert, wie ich eine fehlgeschlagene Autorisierung im JSON-Format zurückgeben kann. Derzeit wird der 403-Seitenfehler anstelle von JSON ausgegeben.Wie 403 Antwort im JSON-Format in Laravel 5.2 zurückgegeben werden?

Controller: TenantController.php

class TenantController extends Controller 
{ 
    public function show($id) 
    { 
     $tenant = Tenant::find($id); 
     if($tenant == null) return response()->json(['error' => "Invalid tenant ID."],400); 
     $this->authorize('show',$tenant); 
     return $tenant; 
    } 
} 

Politik: TenantPolicy.php

class TenantPolicy 
{ 
    use HandlesAuthorization; 
    public function show(User $user, Tenant $tenant) 
    { 
     $users = $tenant->users(); 
     return $tenant->users->contains($user->id); 
    } 
} 

Die Ermächtigung zur Zeit arbeitet gut, aber es ist eine 403 verbotene Seite zeigt nach oben statt json Fehler zurückzugeben. Ist es möglich, es als JSON für die 403 zurückzugeben? Und ist es möglich, es für alle fehlgeschlagenen Autorisierungen global zu machen (nicht nur in diesem Controller)?

+0

würde ich eine 3rd-Party-Bibliothek wie Dingo/api verwenden. Es handhabt das für Sie, ebenso wie Versionierung und Transformatoren. https://github.com/dingo/api – musicvicious

Antwort

11

Wir haben es geschafft, dies zu beheben, indem die Ausnahmen-Handler in App\Exceptions\Handler.php gefunden Modifizieren es in der render Hinzufügen Funktion.

public function render($request, Exception $e) 
{ 
    if ($e instanceof AuthorizationException) 
    { 
     return response()->json(['error' => 'Not authorized.'],403); 
    } 
    return parent::render($request, $e); 
} 
+0

das funktioniert nicht in Laravel 5.4 'dd ($ instateof AuthorizationException)' return false. – Rbex

+0

Es funktioniert immer noch. Ist Ihre Ausnahme wirklich eine Instanz von AuthorizationException? Vielleicht haben Sie vergessen, die AuthorizationException-Klasse mit dem Operator "use" zu importieren? – kremuwa

1

Ja, stellen ein einfaches, bevor Methode in der Politik, die vorherige Prüfung durch alle anderen Genehmigung ausgeführt werden,

public function before($user, $ability,Request $request) 
{ 
    if (!yourconditiontrue) { 
     if ($request->ajax()) { 
      return response('Unauthorized.', 401); 
     } else { 
      return abort('403'); 
     } 
    } 
} 
+0

Akram, in 'TenantPolicy.php', wird es ein paar Funktionen drin haben wie' update' und 'store' und es wird verschiedene bedingte Anweisungen haben. Was soll ich dann in die 'yourconditiontrue' eingeben? –

+0

was auch immer Ihre Berechtigungslogik, um wahr falsch zurückzugeben, wenn es so ist, dann müssen Sie die Bedingungen für die jeweiligen Funktionen tun, lassen Sie mich mein Wissen über Laravel Policy aktualisieren und kommen mit einer Lösung Abend, –

1

können Sie abfangen die Ausnahme

try { 
     $this->authorize('update', $data); 
    } catch (\Exception $e) 
    { 
     return response()->json(null, 403); 
    }