Аутентификация: вход, регистрация, защита
Аутентификация — это система входа и регистрации пользователей, и Laravel даёт её почти готовой через стартовые наборы и фасад Auth.
Суть: стартовый набор Breeze ставит регистрацию, вход и сброс пароля одной командой. Фасад
Authи middlewareauth/guestуправляют доступом, а$request->user()даёт текущего пользователя.
Почти каждому приложению нужны личные кабинеты: пользователь регистрируется, входит, видит свои данные. Писать это с нуля — значит вручную хешировать пароли, управлять сессиями, защищаться от атак. Laravel избавляет от этой работы: стартовые наборы (Breeze, Jetstream) генерируют всю аутентификацию готовой, а вам остаётся лишь подключить нужные правила доступа.
Laravel Breeze — минимальный, понятный набор. Он создаёт контроллеры, маршруты и Blade-страницы для регистрации, входа, выхода, сброса пароля и подтверждения email. Под капотом он использует встроенную систему гвардов (guards) и сессии. Вам достаточно понять три инструмента: фасад Auth, middleware и доступ к текущему пользователю.
Установка Breeze
composer require laravel/breeze --dev
php artisan breeze:install
php artisan migrateФасад Auth и текущий пользователь
<?php
use Illuminate\Support\Facades\Auth;
// проверить, вошёл ли пользователь
if (Auth::check()) {
$user = Auth::user(); // текущий пользователь
echo $user->name;
}
// то же через объект Request
public function profile(Request $request)
{
$user = $request->user(); // null, если гость
return view('profile', ['user' => $user]);
}
// ручной выход
Auth::logout();Защита маршрутов middleware
Middleware auth пускает только вошедших пользователей, а guest — наоборот, только гостей (для страниц логина и регистрации):
<?php
// только для авторизованных
Route::get('/dashboard', [DashboardController::class, 'index'])
->middleware('auth');
// группа защищённых маршрутов
Route::middleware('auth')->group(function () {
Route::get('/orders', [OrderController::class, 'index']);
Route::get('/settings', [SettingsController::class, 'edit']);
});Как работает под капотом
При входе Laravel проверяет email и пароль (сравнивая хеш), и если всё верно — записывает идентификатор пользователя в сессию. На каждом следующем запросе middleware auth смотрит сессию: есть идентификатор — пользователь считается вошедшим. Пароли никогда не хранятся в открытом виде, только их хеши (bcrypt). При выходе идентификатор из сессии удаляется.
ПОТОК АУТЕНТИФИКАЦИИ
-------------------
Вход: email + пароль
|
hash(пароль) == хеш в БД ?
| да
записать user_id в сессию
Запрос: middleware 'auth' смотрит сессию
user_id есть? --нет--> 302 /login
| да
пропустить к контроллеру
Смоделируем проверку логина с хешем пароля и доступ по сессии на Python.
Попробуй сам ▶
import hashlib
def hsh(p):
return hashlib.sha256(p.encode()).hexdigest()
# в БД хранится только хеш пароля
users = {'[email protected]': {'id': 1, 'pw_hash': hsh('secret123')}}
session = {}
def login(email, password):
u = users.get(email)
if u and u['pw_hash'] == hsh(password):
session['user_id'] = u['id']
return 'Вход выполнен'
return 'Неверные данные'
def dashboard():
return 'Кабинет' if 'user_id' in session else '302 -> /login'
print(login('[email protected]', 'wrong'))
print(dashboard())
print(login('[email protected]', 'secret123'))
print(dashboard())
Частые ошибки
- Хранить пароли в открытом виде. Никогда. Laravel хеширует их сам через
Hash::make()/ приведениеhashed. - Забыть middleware
auth. Тогда личные страницы будут доступны всем. - Путать аутентификацию и авторизацию. Первая — «кто ты», вторая — «что тебе можно».
Best practices
- Используйте готовые наборы (Breeze) вместо самописной аутентификации.
- Группируйте защищённые маршруты через
Route::middleware('auth')->group(). - Для проверки «что можно делать» применяйте политики (Policy) и gate, а не только
auth.
Итог: Laravel даёт аутентификацию почти готовой: Breeze ставит весь поток входа, а Auth и middleware управляют доступом. Дальше соберём всё изученное в одном CRUD-приложении.