Аутентификация пользователей

Рейтинг: 70.2% · 15 голосов
Курс по Laravel: маршруты, Eloquent, Blade, миграции, очереди и API. Уроки по главам с обсуждением.
Ответить
Аватара пользователя
oleg_php
Сообщения: 25
Зарегистрирован: 14 май 2026, 08:06

Аутентификация пользователей

Сообщение oleg_php »

АкадемияLaravel с нуляГлава 8 из 18
Оглавление курса (18)
  1. Знакомство с Laravel и установка окружения
  2. Маршруты и контроллеры
  3. Blade: шаблоны и вёрстка страниц
  4. Миграции и структура базы данных
  5. Eloquent ORM: модели и CRUD
  6. Связи в Eloquent: hasMany, belongsTo и другие
  7. Формы и валидация данных
  8. Аутентификация пользователей (вы здесь)
  9. Middleware и защита маршрутов
  10. Очереди и фоновые задачи
  11. Отправка почты и уведомления
  12. Строим REST API на Laravel
  13. Авторизация: Gates и Policies
  14. Работа с файлами: загрузка, Storage, диски local и S3
  15. Тестирование: Pest и PHPUnit, фабрики, сидеры, RefreshDatabase
  16. Сервис-контейнер, провайдеры, свои artisan-команды и планировщик
  17. Деплой в продакшен и обзор современного фронтенда (Vite, Livewire, Inertia)
  18. События и слушатели, кеширование, логирование
В седьмой главе мы научились валидировать формы, и теперь есть всё, чтобы собрать регистрацию и вход на сайт. Аутентификация в Laravel работает поверх сессий, и в этой главе мы соберём её руками: регистрация, логин, логаут, закрытые разделы. Когда позже возьмёте готовый стартер-кит, будете понимать, что у него внутри.

Как это устроено:

За аутентификацию отвечает конфиг config/auth.php. Там описаны гарды (guards) и провайдеры (providers). Гард web хранит состояние входа в сессии, провайдер users достаёт пользователей из базы через модель App\Models\User. Для обычного сайта дефолтные настройки менять не нужно.

Модель User и миграция таблицы users идут с фреймворком из коробки, вы их видели в главах 4 и 5. Обратите внимание на метод casts() модели: поле password там объявлено как hashed. При записи в это поле Laravel сам прогонит строку через bcrypt, вызывать Hash::make вручную не нужно.

Регистрация:

Код: Выделить всё

// app/Http/Controllers/Auth/RegisterController.php
use Illuminate\Validation\Rules\Password;

public function store(Request $request)
{
    $data = $request->validate([
        'name' => ['required', 'string', 'max:255'],
        'email' => ['required', 'email', 'unique:users'],
        'password' => ['required', 'confirmed', Password::min(8)],
    ]);

    $user = User::create($data);

    Auth::login($user);

    return redirect()->route('dashboard');
}
Правило confirmed требует, чтобы в форме было поле password_confirmation с тем же значением. Password::min(8) импортируется из Illuminate\Validation\Rules\Password, к нему можно дописать ->letters()->numbers(), если нужны требования пожёстче. После создания пользователя сразу логиним его через Auth::login, чтобы не гонять человека на форму входа.

Вход и выход:

Код: Выделить всё

// app/Http/Controllers/Auth/LoginController.php
public function store(Request $request)
{
    $credentials = $request->validate([
        'email' => ['required', 'email'],
        'password' => ['required'],
    ]);

    if (Auth::attempt($credentials, $request->boolean('remember'))) {
        $request->session()->regenerate();

        return redirect()->intended('/dashboard');
    }

    return back()->withErrors([
        'email' => 'Неверная почта или пароль.',
    ])->onlyInput('email');
}

public function destroy(Request $request)
{
    Auth::logout();

    $request->session()->invalidate();
    $request->session()->regenerateToken();

    return redirect('/');
}
Auth::attempt находит пользователя по email, сравнивает пароль с хэшем через Hash::check и, если всё сошлось, кладёт id пользователя в сессию. Второй аргумент включает "запомнить меня": в куку запишется токен, а его копия в колонку remember_token, она есть в стандартной миграции. Вызов $request->session()->regenerate() обязателен, он защищает от фиксации сессии, когда злоумышленник подсовывает жертве заранее известный id сессии. redirect()->intended() вернёт человека на ту страницу, куда он шёл до того, как его отправили логиниться, а если он открыл /login сразу, то на /dashboard.

Маршруты и доступ:

Код: Выделить всё

// routes/web.php
Route::middleware('guest')->group(function () {
    Route::get('/login', [LoginController::class, 'create'])->name('login');
    Route::post('/login', [LoginController::class, 'store']);
    Route::get('/register', [RegisterController::class, 'create'])->name('register');
    Route::post('/register', [RegisterController::class, 'store']);
});

Route::middleware('auth')->group(function () {
    Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
    Route::post('/logout', [LoginController::class, 'destroy'])->name('logout');
});
Middleware auth не пустит гостя в группу и перекинет его на маршрут с именем login, поэтому имя обязательно. Без него получите ошибку Route [login] not defined. Поменять адрес редиректа можно в bootstrap/app.php через redirectGuestsTo. Middleware guest работает наоборот: залогиненного уводит с формы входа. Текущий пользователь доступен через Auth::user(), $request->user() или хелпер auth()->user(), а в Blade есть директивы @auth и @guest:

Код: Выделить всё

@auth
    <span>{{ auth()->user()->name }}</span>
    <form method="POST" action="{{ route('logout') }}">
        @csrf
        <button type="submit">Выйти</button>
    </form>
@else
    <a href="{{ route('login') }}">Войти</a>
@endauth
Пара слов про стартер-киты. Команда laravel new предлагает готовые наборы (Livewire, React, Vue), где регистрация, вход и сброс пароля уже свёрстаны. В рабочих проектах это экономит день-другой, но внутри там ровно то, что мы написали выше.

Типичные грабли:

Двойное хэширование. Если при касте hashed вы ещё и сами вызываете Hash::make, пароль захэшируется дважды и Auth::attempt всегда будет возвращать false. Симптом: регистрация проходит, вход никогда.

Логаут по GET-ссылке. Выход должен быть POST-формой с @csrf, как в примере выше. Иначе чужой сайт сможет разлогинивать ваших пользователей обычным тегом img, а браузерный префетч ссылок будет выкидывать их из аккаунта сам.

Ручное сравнение паролей. Никаких $user->password === $request->password. Только Auth::attempt или Hash::check.

Забытый regenerate. Без перегенерации сессии после входа вы открыты для session fixation, а без regenerateToken после выхода старый CSRF-токен остаётся живым.

Итог:

Вы собрали полный цикл: регистрация с автологином, вход с "запомнить меня", выход и закрытые маршруты. Middleware auth мы пока использовали как чёрный ящик, в следующей главе разберём, как middleware устроены и как писать свои. А сброс пароля по почте дождётся главы про отправку писем и уведомления.
👍1 ❤️ 🔥3 😄 🤔
✔ Лучший ответ сформирован автоматически — arch22
oleg_php писал(а):пароль захэшируется дважды и Auth::attempt всегда будет возвращать false вот это прям в точку. на прошлой неделе полдня дебажил ровно это: по старой привычке с laravel 8 повесил мутатор setPasswordAttribute с Hash::make, а каст hashed уже стоял в модели. регистрация работает, логин нет, в логах тишина. убрал мутатор и все ожило. проверяйте через tinker: Hash::check('пароль', $us…
Перейти к ответу →
Аватара пользователя
arch22
Сообщения: 2
Зарегистрирован: 21 май 2026, 16:48

Re: Аутентификация пользователей

Сообщение arch22 »

✔ Лучший ответ — сформирован автоматически
oleg_php писал(а):пароль захэшируется дважды и Auth::attempt всегда будет возвращать false
вот это прям в точку. на прошлой неделе полдня дебажил ровно это: по старой привычке с laravel 8 повесил мутатор setPasswordAttribute с Hash::make, а каст hashed уже стоял в модели. регистрация работает, логин нет, в логах тишина. убрал мутатор и все ожило. проверяйте через tinker: Hash::check('пароль', $user->password) должен вернуть true
👍1 ❤️ 🔥 😄 🤔
Аватара пользователя
taylorb
Сообщения: 2
Зарегистрирован: 12 май 2026, 20:53

Re: Аутентификация пользователей

Сообщение taylorb »

а если вход по нику, а не по почте? у меня в проекте поле login вместо email. Auth::attempt примет 'login' => ... или там email жестко зашит?
👍1 ❤️1 🔥 😄 🤔1
Аватара пользователя
scottg1
Сообщения: 2
Зарегистрирован: 12 май 2026, 10:59

Re: Аутентификация пользователей

Сообщение scottg1 »

oleg_php писал(а):redirect()->intended() вернёт человека на ту страницу, куда он шёл
а где laravel хранит этот адрес? в сессии? просто интересно, что будет если человек открыл две вкладки с разными закрытыми страницами и логинится в одной из них
👍 ❤️ 🔥 😄 🤔1
Аватара пользователя
ecrof
Сообщения: 1
Зарегистрирован: 25 май 2026, 08:54

Re: Аутентификация пользователей

Сообщение ecrof »

спасибо за главу, особенно за кусок про логаут POST-ом. у меня в старом пет-проекте выход был обычной ссылкой, и хром периодически сам разлогинивал из админки. грешил на сессии, на хостинг, а оказалось расширение префетчило ссылки на странице. переделал на форму и проблема исчезла, но понял почему только сейчас
👍2 ❤️1 🔥1 😄 🤔
Ответить
← Предыдущая глава
Формы и валидация данных
Следующая глава →
Middleware и защита маршрутов

Все главы курса «Laravel с нуля»

Поделиться темой: ✈ Telegram VK

Вернуться в «Laravel с нуля»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость