Настройка сообщения об исключении разрешения Laravel Spatie

Я добавил пакет разрешений Saptie Laravel в приложение Laravel 5.8 API. Каждый работает нормально, и я получаю исключение, когда пользователь, не являющийся администратором, пытается получить доступ к конкретным маршрутам администратора.

Однако исключение по умолчанию отображается как HTML 403 User does not have the right roles. Учитывая, что я использую это внутри приложения API, я хотел бы вернуть свое собственное сообщение для таких исключений.

Я попытался проверить, есть ли auth()->user()->hasRole('admin'), но все же получил ту же страницу исключения по умолчанию. Вот мой код

маршрут

Route::post('products', 'ProductController@store')->middleware('role:super-admin|admin'); // create a new product

Метод контроллера

if (auth()->user()->hasRole('admin')) {

    // create & store the product
    $product = Product::create($request->all())

    // return new product
    $responseMessage    = 'Successful operation';
    $responseStatus     = 200;
    $productResource    = new ProductResource($product);

    return response()->json([
        'responseMessage'   => $responseMessage,
        'responseStatus'    => $responseStatus,
        'product'           => $productResource
    ]);
} else {

    return response()->json([
        'responseMessage'   => 'You do not have required authorization.',
        'responseStatus'    => 403,
    ]);
}

Почему мое собственное сообщение не отображается?


person Mena    schedule 03.09.2019    source источник
comment
В опубликованном вами коде не отображается UnauthorizedException, защищали ли вы свои маршруты с помощью промежуточного программного обеспечения, например. role:admin? Если да, то ваш контроллер никогда не достигается, поэтому ваш код никогда не запускается.   -  person Remul    schedule 03.09.2019
comment
@Remul да, я вызываю role:admin промежуточное ПО на маршруте. См. Отредактированный пост для маршрута. Если роль пользователя проверяется до попадания в контроллер, что мне делать, чтобы вернуть ответ json вместо рендеринга страницы html 403?   -  person Mena    schedule 03.09.2019


Ответы (1)


Поскольку вы защищаете свои маршруты с помощью role промежуточного программного обеспечения, UnauthorizedException будет брошен до того, как код вашего контроллера когда-либо будет достигнут.

Что вы можете сделать, так это использовать метод render обработчика исключений laravels, проверить тип исключения и вернуть свой ответ:

из документов:

Метод рендеринга отвечает за преобразование данного исключения в ответ HTTP, который должен быть отправлен обратно в браузер. По умолчанию исключение передается базовому классу, который генерирует для вас ответ. Однако вы можете проверить тип исключения или вернуть свой собственный ответ.

app / Exceptions / Handler.php

use Spatie\Permission\Exceptions\UnauthorizedException;

public function render($request, Exception $exception)
{
    if ($exception instanceof UnauthorizedException) {
        return response()->json([
            'responseMessage' => 'You do not have required authorization.',
            'responseStatus'  => 403,
        ]);
    }

    return parent::render($request, $exception);
}
person Remul    schedule 03.09.2019
comment
Я добавил ваш код в render метод app / Exceptions / Handler.php, но все же получил страницу исключений по умолчанию. - person Mena; 03.09.2019
comment
Вы импортировали UnauthorizedException? например use Spatie\Permission\Exceptions\UnauthorizedException; - person Remul; 03.09.2019
comment
Теперь это добавлено в документацию, спасибо, ребята ! - person Laurence Cooper; 07.10.2019