2016-07-26 5 views
7

Я пытаюсь разработать RESTful API с Laravel 5.2. Я наткнулся на то, как вернуть неудачную авторизацию в формате JSON. В настоящее время он выбрасывает ошибку страницы 403 вместо JSON.Как вернуть 403 ответ в формате JSON в Laravel 5.2?

Контроллер: 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; 
    } 
} 

Политика: TenantPolicy.php

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

Разрешение в настоящее время работает нормально, но он показывает вверх 403 запрещенную страницу вместо возврата ошибки JSon. Можно ли вернуть его как JSON для 403? И, возможно ли сделать это глобальным для всех неудачных авторизаций (не только в этом контроллере)?

+0

Я хотел бы использовать библиотеку 3rd партии, как динго/API. Он обрабатывал это для вас, а также для управления версиями и трансформаторами. https://github.com/dingo/api – musicvicious

ответ

11

Нам удалось решить эту проблему путем изменений обработчика исключений найденного в App\Exceptions\Handler.php добавить его в render функция.

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

это не работает в Laravel 5.4 'dd ($ e instaceof AuthorizationException)' return false. – Rbex

+0

Он по-прежнему работает. Является ли ваше исключение действительно экземпляром AuthorizationException? Может быть, вы забыли импортировать класс AuthorizationException с помощью оператора «use»? – kremuwa

1

Да, сделать простой, прежде чем метод в вашей политике, которая будет выполняться до всех других проверок авторизации,

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

Akram, в 'TenantPolicy.php', там будет несколько функций, таких как' update' и 'store', и у него будут разные условные операторы. Что я должен поставить в 'yourconditiontrue' тогда? –

+0

независимо от вашей логики авторизации, чтобы вернуть истинное значение false, если это так, то вам нужно выполнить условия для каждой из соответствующих функций, позвольте мне освежить мои знания о политике Laravel и вернуться вечером решения, –

1

Вы можете перехватить исключение

try { 
     $this->authorize('update', $data); 
    } catch (\Exception $e) 
    { 
     return response()->json(null, 403); 
    } 
Смежные вопросы