AccessDeniedHttpException
Исключение AccessDeniedHttpException относится к группе HTTP-исключений
и выбрасывается при попытке доступа к защищённому ресурсу без соответствующих
прав. Это исключение автоматически преобразуется в HTTP-ответ с кодом 403.
Оно часто используется в связке с политиками авторизации Laravel и методом
authorize. В контроллерах это исключение выбрасывается, когда
пользователь не прошёл проверку прав доступа.
Синтаксис
<?php
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
throw new AccessDeniedHttpException($message);
?>
Параметр $message - это строка с сообщением об ошибке.
Сообщение опционально и будет отображаться на странице ошибки.
Пример
Давайте создадим контроллер, который проверяет права пользователя на редактирование статьи:
<?php
namespace App\Http\Controllers;
use App\Models\Article;
use Illuminate\Http\Request;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
class ArticleController extends Controller
{
public function edit(Request $request, $id)
{
$article = Article::findOrFail($id);
if ($article->user_id !== $request->user()->id) {
throw new AccessDeniedHttpException('You do not have permission to edit this article.');
}
return view('articles.edit', ['article' => $article]);
}
}
?>
Результат выполнения кода при попытке редактирования чужой статьи:
HTTP 403 Forbidden
You do not have permission to edit this article.
Пример
Использование исключения совместно с методом authorize
и политиками авторизации:
<?php
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Http\Request;
class PostController extends Controller
{
public function update(Request $request, $id)
{
$post = Post::findOrFail($id);
$this->authorize('update', $post);
$post->update($request->all());
return redirect()->route('posts.index');
}
}
?>
Результат выполнения кода, когда политика возвращает false:
HTTP 403 Forbidden
This action is unauthorized.
Метод authorize автоматически выбрасывает исключение
AccessDeniedHttpException при неудачной проверке прав.
Пример
Обработка исключения в пользовательском обработчике ошибок для кастомизации ответа:
<?php
namespace App\Exceptions;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Throwable;
class Handler extends ExceptionHandler
{
public function render($request, Throwable $exception)
{
if ($exception instanceof AccessDeniedHttpException) {
return response()->json([
'error' => 'Access denied',
'message' => $exception->getMessage()
], 403);
}
return parent::render($request, $exception);
}
}
?>
Результат выполнения кода при обращении к API с недостаточными правами:
{"error":"Access denied","message":"You do not have permission to edit this article."}
Этот подход позволяет возвращать структурированные JSON-ответы для API-приложений вместо стандартной HTML-страницы ошибки.
Смотрите также
-
исключение
HttpException,
базовое HTTP-исключение для всех ошибок -
исключение
NotFoundHttpException,
выбрасывается при отсутствии ресурса -
исключение
AuthorizationException,
используется в политиках авторизации -
исключение
MethodNotAllowedHttpException,
возникает при недопустимом HTTP-методе