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)?
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);
}
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');
}
}
}
Vous pouvez intercepter l'exception
try {
$this->authorize('update', $data);
} catch (\Exception $e)
{
return response()->json(null, 403);
}