Come restituire 403 risposta in formato JSON in Laravel 5.2?

Sto cercando di sviluppare un API RESTful con Laravel 5.2. Io sono inciampato su come restituire la mancata autorizzazione in formato JSON. Attualmente, si sta gettando il 403 pagina di errore invece di JSON.

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;
    }
}

Politica: TenantPolicy.php

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

L’autorizzazione è attualmente lavorando bene ma sta mostrando un 403 forbidden pagina invece di restituire json errore. È possibile restituire come JSON per il 403? E, è possibile rendere globale per tutti gli errori di autorizzazioni (non solo in questo controller)?

  • Vorrei utilizzare un 3rd party biblioteca come dingo/api. Ha gestito questo per voi, così come il controllo delle versioni e dei trasformatori. github.com/dingo/api
InformationsquelleAutor Heru S | 2016-07-26



3 Replies
  1. 23

    Siamo riusciti a risolvere il problema modificando le eccezioni gestore trovato in App\Exceptions\Handler.php di aggiungere in render funzione.

    public function render($request, Exception $e)
    {
        if ($e instanceof AuthorizationException)
        {
            return response()->json(['error' => 'Not authorized.'],403);
        }
        return parent::render($request, $e);
    }
    • questo non funziona in Laravel 5.4 dd($e instaceof AuthorizationException) restituire false.
    • Funziona ancora. È l’eccezione davvero un’istanza di AuthorizationException? Forse si è dimenticato di importare il AuthorizationException classe utilizzando la “uso” operatore?
  2. 3

    Sì, fare un semplice metodo nella vostra politica, che viene eseguito prima di tutti gli altri controlli di autorizzazione,

    public function before($user, $ability,Request $request)
    {
        if (!yourconditiontrue) {
             if ($request->ajax()) {
                return response('Unauthorized.', 401);
            } else {
                return abort('403');
            }
        }
    }
    • Akram, in TenantPolicy.php, avrà alcune funzioni, come update e store e si hanno diverse istruzioni condizionali. Cosa devo mettere nel yourconditiontrue poi?
    • qualunque sia la vostra logica di autorizzazione per restituire true false, se è così, allora devi fare le condizioni di ciascuna delle rispettive funzioni , mi permetta di aggiornare le mie conoscenze su Laravel Politica e torna con una soluzione di sera,
  3. 2

    È possibile intercettare l’eccezione

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

Lascia un commento