Аутентификация: вход, регистрация, защита

Аутентификация — это система входа и регистрации пользователей, и Laravel даёт её почти готовой через стартовые наборы и фасад Auth.

Суть: стартовый набор Breeze ставит регистрацию, вход и сброс пароля одной командой. Фасад Auth и middleware auth/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-приложении.

Проверьте себя
1. Что делает middleware auth?
AХеширует пароли
BПропускает только вошедших пользователей, гостей отправляет на логин
CСоздаёт таблицы
DВалидирует формы
2. Как Laravel хранит пароли пользователей?
AВ открытом виде
BВ виде хеша (bcrypt), а не открытым текстом
CВ .env
DВ cookie браузера