Исключение AuthenticationException
Исключение AuthenticationException в Laravel возникает
в тех случаях, когда пользователь пытается получить доступ
к маршруту или действию, требующему аутентификации,
но при этом не авторизован. Это исключение автоматически
выбрасывается системой при использовании посредника
auth, а также может быть вызвано вручную
в контроллере или другом месте приложения.
Оно относится к пространству имён
Illuminate\Auth\AuthenticationException.
Конструктор исключения
Конструктор AuthenticationException принимает
несколько параметров, позволяющих настроить сообщение
и поведение при возникновении ошибки:
<?php
use Illuminate\Auth\AuthenticationException;
// Создание исключения с кастомным сообщением
$exception = new AuthenticationException('Custom error message');
// Создание исключения с указанием redirect URL
$exception = new AuthenticationException(
'Please login first',
[], // дополнительные данные
'/login' // URL для редиректа
);
// Создание исключения с указанием guard'ов
$exception = new AuthenticationException(
'Unauthenticated',
['web', 'api'] // guards, которые были использованы
);
?>
Пример с посредником auth
Наиболее частый способ возникновения исключения -
это использование посредника auth в маршрутах.
Когда пользователь не аутентифицирован, посредник
автоматически выбрасывает AuthenticationException.
Рассмотрим настройку маршрута:
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\DashboardController;
Route::get('/dashboard', [DashboardController::class, 'index'])
->middleware('auth')
->name('dashboard');
?>
Если неаутентифицированный пользователь попытается
перейти по адресу /dashboard, будет выброшено
исключение, которое Laravel обработает и перенаправит
на страницу входа по умолчанию.
Обработка исключения в контроллере
Иногда возникает необходимость вручную проверить аутентификацию пользователя и выбросить исключение в контроллере. Это может быть полезно при нестандартной логике авторизации:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Support\Facades\Auth;
class SettingsController extends Controller
{
public function update(Request $request)
{
if (!Auth::check()) {
throw new AuthenticationException(
'You must be logged in to update settings'
);
}
// Логика обновления настроек
return redirect()->back()->with('success', 'Settings updated');
}
}
?>
Результат выполнения кода при неаутентифицированном пользователе:
"Exception thrown: You must be logged in to update settings"
Обработка в исключениях API
При разработке API исключение AuthenticationException
может быть перехвачено и преобразовано в JSON-ответ.
Для этого необходимо настроить обработку в классе
Handler. Пример обработки:
<?php
namespace App\Exceptions;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Auth\AuthenticationException;
use Throwable;
class Handler extends ExceptionHandler
{
public function render($request, Throwable $exception)
{
if ($exception instanceof AuthenticationException) {
return response()->json([
'status' => 'error',
'message' => 'Authentication required',
'code' => 401
], 401);
}
return parent::render($request, $exception);
}
}
?>
Результат выполнения запроса к API без токена:
{"status":"error","message":"Authentication required","code":401}
Пример с кастомным редиректом
При возникновении исключения можно перенаправить пользователя на произвольный URL, передав его в конструктор исключения:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Auth\AuthenticationException;
class ProfileController extends Controller
{
public function show(Request $request)
{
if (!$request->user()) {
throw new AuthenticationException(
'Please login to view profile',
[],
route('login.custom')
);
}
return view('profile.show');
}
}
?>
Смотрите также
-
класс
Handler,
который используется для кастомизации обработки исключений -
метод
render,
который рендерит исключение в HTTP-ответ -
исключение
AuthorizationException,
которое возникает при недостатке прав доступа -
метод
report,
который логирует информацию об исключении