php - ¿Cómo devolver la respuesta 403 en formato JSON en Laravel 5.2?
laravel-5 laravel-5.2 (3)
Estoy tratando de desarrollar una API RESTful con Laravel 5.2. Me tropecé con cómo devolver la autorización fallida en formato JSON. Actualmente, arroja el error de 403 páginas en lugar de JSON.
Controlador: 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;
}
}
Política: TenantPolicy.php
class TenantPolicy
{
use HandlesAuthorization;
public function show(User $user, Tenant $tenant)
{
$users = $tenant->users();
return $tenant->users->contains($user->id);
}
}
La autorización actualmente funciona bien, pero muestra una página prohibida de 403 en lugar de devolver el error json. ¿Es posible devolverlo como JSON para el 403? Y, ¿es posible hacerlo global para todas las autorizaciones fallidas (no solo en este controlador)?
Logramos resolver esto modificando el manejador de excepciones encontrado en App/Exceptions/Handler.php
agregándolo en la función de render
.
public function render($request, Exception $e)
{
if ($e instanceof AuthorizationException)
{
return response()->json([''error'' => ''Not authorized.''],403);
}
return parent::render($request, $e);
}
Sí, haga un método simple antes en su póliza que se ejecutará antes de todas las demás verificaciones de autorización,
public function before($user, $ability,Request $request)
{
if (!yourconditiontrue) {
if ($request->ajax()) {
return response(''Unauthorized.'', 401);
} else {
return abort(''403'');
}
}
}
Puedes interceptar la excepción
try {
$this->authorize(''update'', $data);
} catch (/Exception $e)
{
return response()->json(null, 403);
}