Аутентификация и защита маршрутов
Настройка системы регистрации и авторизации пользователей, а также защита приватных страниц с помощью middleware. Применение метода Scaffolding для поэтапного внедрения безопасности.
Безопасность и идентификация пользователей — критически важная часть любого интернет-магазина. Без аутентификации мы не сможем привязать заказ к конкретному человеку или предоставить ему личный кабинет. В этом уроке мы применим концепцию Scaffolding: начнем с понимания того, как Laravel обрабатывает HTTP-запросы, затем внедрим посредников (Middleware), и, наконец, защитим наши маршруты. Middleware — это слой кода, который фильтрует входящие запросы к вашему приложению. Представьте его как охранника на входе в клуб. Если пользователь пытается зайти на страницу оформления заказа (/checkout), охранник (middleware 'auth') проверяет, есть ли у пользователя 'билет' (авторизован ли он). Если да — запрос проходит дальше к контроллеру. Если нет — пользователь перенаправляется на страницу логина. Laravel предоставляет готовую систему аутентификации, которую мы будем использовать для защиты наших маршрутов.
// Файл: routes/web.php
use App\Http\Controllers\ProfileController;
use App\Http\Controllers\CheckoutController;
use Illuminate\Support\Facades\Route;
// Публичные маршруты (доступны всем)
Route::get('/', [HomeController::class, 'index'])->name('home');
Route::get('/catalog', [ProductController::class, 'index'])->name('catalog');
// Защищенные маршруты (только для авторизованных)
Route::middleware('auth')->group(function () {
Route::get('/profile', [ProfileController::class, 'index'])->name('profile');
Route::get('/checkout', [CheckoutController::class, 'index'])->name('checkout');
Route::post('/checkout', [CheckoutController::class, 'process'])->name('checkout.process');
Route::get('/orders/success', [OrderController::class, 'success'])->name('orders.success');
});
В файле routes/web.php мы используем метод Route::middleware('auth')->group(...). Это невероятно удобный способ применить один и тот же фильтр сразу к нескольким маршрутам. Типичная ошибка начинающих — забывать оборачивать POST-маршруты в middleware. Если вы защитите только GET-маршрут страницы оформления заказа, злоумышленник сможет отправить POST-запрос напрямую через инструменты вроде Postman, обойдя форму. Оборачивая маршруты в группу, мы гарантируем полную защиту. Как только пользователь проходит через этот middleware, внутри контроллера нам становится доступен глобальный хелпер auth(). Например, вызов auth()->id() вернет ID текущего авторизованного пользователя, что абсолютно необходимо при сохранении заказа в базу данных. Если пользователь не авторизован, этот метод вернет null, но благодаря middleware до этой строчки кода выполнение даже не дойдет.
| Директива Blade | Описание | Пример использования |
|---|---|---|
| @auth ... @endauth | Отображает контент только для авторизованных пользователей. | @auth <a href='/profile'>Профиль</a> @endauth |
| @guest ... @endguest | Отображает контент только для НЕавторизованных (гостей). | @guest <a href='/login'>Войти</a> @endguest |
| auth()->user() | Возвращает модель текущего пользователя. | {{ auth()->user()->name }} |
Помимо защиты бэкенда (маршрутов и контроллеров), нам нужно адаптировать пользовательский интерфейс (Frontend). В шаблонизаторе Blade есть специальные директивы @auth и @guest. С их помощью мы можем динамически менять шапку сайта. Например, если человек зашел как гость, мы показываем ему кнопки 'Войти' и 'Регистрация'. Как только он авторизуется, эти кнопки исчезают, и на их месте появляется 'Мой профиль' и 'Выйти'. Это базовый принцип Scaffolding — мы выстраиваем логику шаг за шагом, связывая серверную безопасность с клиентским отображением.
Как называется слой кода в Laravel, который перехватывает HTTP-запросы для их фильтрации (например, для проверки авторизации)? Напишите одно слово на английском.
Флеш-карточки
Что вернет функция auth()->id() для неавторизованного пользователя?
Нажмите, чтобы увидеть ответ
Она вернет null.
Нажмите, чтобы вернуться
Для чего нужна группа маршрутов Route::middleware('auth')->group(...) ?
Нажмите, чтобы увидеть ответ
Для защиты всех маршрутов внутри группы от неавторизованного доступа. Если гость попытается зайти, его перекинет на логин.
Нажмите, чтобы вернуться