web-dev-qa-db-fra.com

Comment retourner une réponse 403 au format JSON en Laravel 5.2?

J'essaie de développer une API RESTful avec Laravel 5.2. Je suis trébuché sur la façon de retourner une autorisation ayant échoué au format JSON. Actuellement, il renvoie l'erreur de page 403 au lieu de JSON.

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

Politique: TenantPolicy.php

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

L'autorisation fonctionne actuellement correctement, mais elle affiche une page interdite 403 au lieu de renvoyer une erreur json. Est-il possible de le renvoyer en JSON pour la 403? Et, est-il possible de le rendre global pour toutes les autorisations ayant échoué (pas seulement dans ce contrôleur)?

15
Heru S

Nous avons réussi à résoudre ce problème en modifiant le gestionnaire d'exceptions trouvé dans App\Exceptions\Handler.php en l'ajoutant dans la fonction render.

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

Oui, créez une méthode avant simple dans votre police qui sera exécutée avant tous les autres contrôles d'autorisation,

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

Vous pouvez intercepter l'exception

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