Skip to content

Authentication (Xác thực)

Giới thiệu (Introduction)

Nhiều ứng dụng web cung cấp cách để users xác thực (authenticate) và "đăng nhập". Laravel cung cấp các công cụ để triển khai authentication nhanh chóng, an toàn và dễ dàng.

Ở cốt lõi, hệ thống authentication của Laravel gồm guardsproviders:

  • Guards: Định nghĩa cách users được xác thực cho mỗi request (ví dụ: session guard dùng session storage và cookies)
  • Providers: Định nghĩa cách users được truy xuất từ persistent storage (Eloquent, database query builder)

File cấu hình: config/auth.php.

GHI CHÚ

Guards và providers không phải là "roles" và "permissions". Để phân quyền user actions, xem tài liệu Authorization.

Starter Kits

Cách nhanh nhất: Dùng Laravel Starter Kits — tự động scaffold toàn bộ authentication system (registration, login, email verification, password reset).

Tổng quan hệ sinh thái (Ecosystem Overview)

PackageMô tả
Starter KitsScaffold authentication scaffolding hoàn chỉnh
Laravel FortifyHeadless authentication backend
Laravel PassportOAuth2 server (API authentication)
Laravel SanctumAPI token authentication & SPA auth
Laravel SocialiteOAuth social login (Google, Facebook, GitHub, v.v.)

Authentication Quickstart

Lấy User đã xác thực (Retrieving the Authenticated User)

php
use Illuminate\Support\Facades\Auth;

// Lấy user hiện tại
$user = Auth::user();

// Lấy ID user hiện tại
$id = Auth::id();

// Hoặc qua Request instance
$user = $request->user();

Kiểm tra đã xác thực

php
use Illuminate\Support\Facades\Auth;

if (Auth::check()) {
    // User đã đăng nhập...
}

Bảo vệ Routes (Protecting Routes)

Dùng middleware auth:

php
Route::get('/flights', function () {
    // Chỉ authenticated users...
})->middleware('auth');

Redirect khi chưa xác thực

Middleware auth redirect user chưa xác thực đến route login. Tùy chỉnh trong bootstrap/app.php:

php
use Illuminate\Http\Request;

->withMiddleware(function (Middleware $middleware) {
    $middleware->redirectGuestsTo('/login');

    // Hoặc dùng closure
    $middleware->redirectGuestsTo(fn (Request $request) => route('login'));
})

Chỉ định Guard

php
Route::get('/flights', function () {
    // ...
})->middleware('auth:api');

Login Throttling

Starter kits tự động giới hạn số lần đăng nhập (throttle) — sau nhiều lần sai, user bị block vài phút.

Xác thực thủ công (Manually Authenticating Users)

php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Auth;

class LoginController extends Controller
{
    public function authenticate(Request $request): RedirectResponse
    {
        $credentials = $request->validate([
            'email' => ['required', 'email'],
            'password' => ['required'],
        ]);

        if (Auth::attempt($credentials)) {
            $request->session()->regenerate();

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

        return back()->withErrors([
            'email' => 'Thông tin đăng nhập không chính xác.',
        ])->onlyInput('email');
    }
}

Method attempt nhận mảng key/value. Password sẽ tự động được hash trước khi so sánh.

Thêm điều kiện

php
if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
    // User active và credentials đúng...
}

Chỉ định Guard

php
if (Auth::guard('admin')->attempt($credentials)) {
    // Dùng "admin" guard...
}

Remember Me (Ghi nhớ đăng nhập)

php
if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
    // User được ghi nhớ...
}

if (Auth::viaRemember()) {
    // User được authenticate qua "remember me" cookie...
}

Các phương thức khác

php
// Login user instance trực tiếp
Auth::login($user);
Auth::login($user, $remember = true);

// Login bằng ID
Auth::loginUsingId(1);
Auth::loginUsingId(1, $remember = true);

// Authenticate cho 1 request duy nhất (không session)
Auth::once(['email' => 'taylor@example.com', 'password' => 'secret']);

HTTP Basic Authentication

php
Route::get('/profile', function () {
    // Chỉ authenticated users...
})->middleware('auth.basic');

Stateless HTTP Basic

Cho API authentication không dùng session:

php
// Middleware tùy chỉnh
public function handle(Request $request, Closure $next): Response
{
    return Auth::onceBasic() ?: $next($request);
}

Đăng xuất (Logging Out)

php
use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Auth;

Route::post('/logout', function (Request $request): RedirectResponse {
    Auth::logout();

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

    return redirect('/');
})->name('logout');

Hủy Sessions trên thiết bị khác

php
Auth::logoutOtherDevices($currentPassword);

Xác nhận mật khẩu (Password Confirmation)

Yêu cầu user nhập lại password trước actions nhạy cảm. Middleware password.confirm:

php
Route::get('/settings', function () {
    // ...
})->middleware(['password.confirm']);

Route Password Confirmation

php
Route::get('/confirm-password', function () {
    return view('auth.confirm-password');
})->middleware('auth')->name('password.confirm');

Route::post('/confirm-password', function (Request $request) {
    if (! Hash::check($request->password, $request->user()->password)) {
        return back()->withErrors([
            'password' => ['Mật khẩu không chính xác.']
        ]);
    }

    $request->session()->passwordConfirmed();

    return redirect()->intended();
})->middleware(['auth', 'throttle:6,1']);

Custom Guards

Đăng ký trong AppServiceProvider:

php
use App\Services\Auth\JwtGuard;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Support\Facades\Auth;

Auth::extend('jwt', function (Application $app, string $name, array $config) {
    return new JwtGuard(Auth::createUserProvider($config['provider']));
});

Sử dụng trong config/auth.php:

php
'guards' => [
    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],

Custom User Providers

Implement Illuminate\Contracts\Auth\UserProvider:

php
public function retrieveById($identifier);
public function retrieveByToken($identifier, $token);
public function updateRememberToken(Authenticatable $user, $token);
public function retrieveByCredentials(array $credentials);
public function validateCredentials(Authenticatable $user, array $credentials);
public function rehashPasswordIfRequired(Authenticatable $user, array $credentials, bool $force = false);

Events

Laravel dispatch các events trong quá trình authentication:

EventMô tả
AttemptingĐang thử authentication
AuthenticatedAuthentication thành công
LoginUser đăng nhập
FailedAuthentication thất bại
ValidatedCredentials hợp lệ
LogoutUser đăng xuất
OtherDeviceLogoutLogout thiết bị khác
CurrentDeviceLogoutLogout thiết bị hiện tại