Авторизация и защита маршрутов
Студент внедрит систему регистрации и входа, а также научится защищать страницы профиля и оформления заказа с помощью middleware.
Введение в аутентификацию Laravel
Создание интернет-магазина невозможно без надежной системы идентификации пользователей. В Laravel процесс аутентификации (проверки, кто именно делает запрос) и авторизации (проверки прав на выполнение действия) реализован на высшем уровне. Мы будем использовать подход Direct Instruction для пошагового внедрения этой системы. В ядре Laravel уже встроены фасады Auth и Session, которые управляют состоянием пользователя. Типичная ошибка новичков — попытка написать свою систему хэширования паролей или управления сессиями. Это небезопасно. Laravel использует алгоритм Bcrypt по умолчанию. Когда пользователь вводит логин и пароль, фреймворк извлекает хэш из базы данных и сравнивает его с введенным паролем. Если они совпадают, в сессию записывается ID пользователя, и фреймворк понимает, что последующие запросы идут от авторизованного лица.
Посредники (Middleware) и защита маршрутов
Основываясь на методологии Mastery Learning, мы не двинемся дальше, пока не усвоим концепцию Middleware. Middleware (Посредник) — это слой кода, который фильтрует HTTP-запросы, поступающие в ваше приложение. Представьте его как охранника на входе в клуб. Если маршрут защищен посредником 'auth', то при попытке неавторизованного пользователя зайти на страницу профиля или оформления заказа, Middleware перехватит запрос и перенаправит (redirect) пользователя на страницу логина. Это критически важно для безопасности e-commerce платформы. В Laravel посредники регистрируются в ядре HTTP (app/Http/Kernel.php). Для защиты группы маршрутов мы используем метод group() в файле routes/web.php. Это позволяет применить правило сразу к нескольким адресам, сохраняя код чистым (DRY - Don't Repeat Yourself).
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']);
});
Анализ кода защиты маршрутов
Давайте разберем предоставленный выше код. Мы используем фасад Route, вызывая метод middleware('auth'). Внутрь метода group мы передаем замыкание (closure), в котором объявляем маршруты. Первый маршрут — GET-запрос к '/profile', который обрабатывается методом index контроллера ProfileController и имеет имя 'profile'. Второй и третий маршруты относятся к оформлению заказа (Checkout). Обратите внимание на использование POST-запроса для метода 'process' — именно он будет обрабатывать логику сохранения заказа в БД, что мы разберем в уроке 14. Использование именованных маршрутов (метод name()) — это лучшая практика. В Blade-шаблонах вы будете ссылаться на маршрут как route('checkout'), и если URL-адрес изменится в будущем (например, на '/order/checkout'), вам не придется переписывать все ссылки в HTML-коде.
Что произойдет, если неавторизованный (гость) пользователь попытается перейти по маршруту '/checkout', защищенному middleware('auth')?
Задание
Сценарий: Настройка защиты пользовательского интерфейса. Вам необходимо обеспечить безопасность личных данных покупателей.
- Откройте файл routes/web.php в вашем проекте.
- Найдите маршруты, отвечающие за отображение корзины и каталога товаров — убедитесь, что они НЕ обернуты в middleware 'auth' (они должны быть публичными).
- Создайте новую группу маршрутов с middleware('auth').
- Перенесите внутрь этой группы маршруты контроллеров ProfileController и CheckoutController.
- Запустите локальный сервер (php artisan serve) и попытайтесь зайти на /checkout в режиме Инкогнито, чтобы убедиться, что вас перекидывает на страницу логина.