Я добавил необходимые псевдонимы промежуточного программного обеспечения в bootstrap/app.php:
Код: Выделить всё
$middleware->alias([
...
'abilities' => \Laravel\Sanctum\Http\Middleware\CheckAbilities::class,
'ability' => \Laravel\Sanctum\Http\Middleware\CheckForAnyAbility::class,
]);
Код: Выделить всё
Route::middleware(['auth:sanctum', 'abilities:foo'])->group(function () {
Route::get('/foo', [FooController::class, 'foo']);
});
Код: Выделить всё
$token_without_abilities = $user->createToken('name', [], Carbon::now()->addMinutes(10))->plainTextToken;
Я хочу перехватить это исключение и вернуть ответ JSON с правильным сообщением об ошибке, поэтому я добавил следующее в свой bootstrap/app.php:
Код: Выделить всё
use Laravel\Sanctum\Exceptions\MissingAbilityException;
->withExceptions(function (Exceptions $exceptions) {
$exceptions->render(function (MissingAbilityException $exception, Request $request) {
Log::debug('MissingAbilityException exception: ' . printr_r($exception->abilities(), true);
return response()->json([
'message' => 'Missing ability ' . $exception->getMessage(),
]);
});
});
Код: Выделить всё
{
"message": "Invalid ability provided.",
"exception": "Symfony\\Component\\HttpKernel\\Exception\\AccessDeniedHttpException",
"file": "/var/www/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php",
"line": 633,
"trace": [
{
"file": "/var/www/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php",
"line": 577,
"function": "prepareException",
"class": "Illuminate\\Foundation\\Exceptions\\Handler",
"type": "->"
},
{
"file": "/var/www/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",
"line": 51,
"function": "render",
"class": "Illuminate\\Foundation\\Exceptions\\Handler",
"type": "->"
},
...
Единственный намек, который я могу найти по этому поводу, — это ответ на проблему Github, задающую более или менее то же самое, что и я. Этот ответ предполагает то, что я уже делаю, AFAICT, хотя и в синтаксисе до версии Laravel 11.
Если я попытаюсь перехватить исключение AccessDeniedHttpException в bootstrap/app.php таким же образом, это работает, но я больше не могу получить доступ к отсутствующей способности, $Exception->abilities(); дает мне вызов неопределенного метода.
Как я могу перехватить исключение MissingAbilityException и получить доступ к фактической отсутствующей способности? Цель состоит в том, чтобы вернуть клиенту ответ JSON с сообщением типа «У вас нет разрешения «foo»».
Подробнее здесь: https://stackoverflow.com/questions/790 ... associated
Мобильная версия