Giao diện
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 guards và providers:
- Guards: Định nghĩa cách users được xác thực cho mỗi request (ví dụ:
sessionguard 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)
| Package | Mô tả |
|---|---|
| Starter Kits | Scaffold authentication scaffolding hoàn chỉnh |
| Laravel Fortify | Headless authentication backend |
| Laravel Passport | OAuth2 server (API authentication) |
| Laravel Sanctum | API token authentication & SPA auth |
| Laravel Socialite | OAuth 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:
| Event | Mô tả |
|---|---|
Attempting | Đang thử authentication |
Authenticated | Authentication thành công |
Login | User đăng nhập |
Failed | Authentication thất bại |
Validated | Credentials hợp lệ |
Logout | User đăng xuất |
OtherDeviceLogout | Logout thiết bị khác |
CurrentDeviceLogout | Logout thiết bị hiện tại |