Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Аутентификация

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

Регистрация

Пароль никогда не хранят в открытом виде — его хешируют функцией Hash::make():

use App\Models\User;
use Illuminate\Support\Facades\Hash;
 
public function register(Request $request)
{
    $data = $request->validate([
        'name' => 'required|max:255',
        'email' => 'required|email|unique:users',
        'password' => 'required|min:8|confirmed',
    ]);
 
    $user = User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => Hash::make($data['password']),
    ]);
 
    Auth::login($user);
 
    return redirect('/profile');
}

Вход

Метод Auth::attempt() ищет пользователя по почте и сверяет пароль с хешем:

use Illuminate\Support\Facades\Auth;
 
public function login(Request $request)
{
    $credentials = $request->validate([
        'email' => 'required|email',
        'password' => 'required',
    ]);
 
    if (Auth::attempt($credentials)) {
        $request->session()->regenerate();
 
        return redirect('/profile');
    }
 
    return back()->withErrors(['email' => 'Неверная почта или пароль.']);
}

Текущий пользователь

$user = Auth::user();    // объект User или null
$id = Auth::id();        // идентификатор или null
$loggedIn = Auth::check(); // true, если пользователь вошёл

В шаблонах для этого есть директивы:

@auth
    <p>Привет, {{ auth()->user()->name }}!</p>
@endauth
 
@guest
    <a href="/login">Войти</a>
@endguest

Защита страниц

Посредник auth перенаправляет гостей на страницу входа:

Route::get('/profile', [ProfileController::class, 'show'])->middleware('auth');

Выход

public function logout(Request $request)
{
    Auth::logout();
    $request->session()->invalidate();
    $request->session()->regenerateToken();
 
    return redirect('/');
}

Выход делают формой с методом POST, а не ссылкой — иначе пользователя можно разлогинить с чужого сайта.

Частая ошибка

После успешного входа нужно вызвать $request->session()->regenerate(). Без этого идентификатор сессии остаётся прежним, и злоумышленник, заранее подсунувший жертве свой идентификатор, получит доступ к её аккаунту. Это называют фиксацией сессии.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.