Laravel Authentication quản lý đăng nhập, đăng xuất, xác thực người dùng. Các thành phần chính:
Guard
Xác định cách người dùng được xác thực.
Ví dụ: guard web
(session) hoặc api
(token).
Mỗi guard có thể dùng provider khác nhau.
Provider
Xác định nguồn dữ liệu lấy thông tin user.
Mặc định là users
table qua Eloquent (eloquent
provider).
📌 Mặc định, Laravel có cấu hình trong config/auth.php
:
'guards' => [
'web' => [
'driver' => 'session', // dùng session để lưu đăng nhập
'provider' => 'users', // sử dụng provider users
],
],
'providers' => [
'users' => [
'driver' => 'eloquent', // dùng model Eloquent
'model' => App\Models\User::class,
],
],
Lưu ý quan trọng: Kế thừa bài số 5, hoặc bài số 6
Nếu bạn chưa có bài số 5, số 6, làm theo các bước
'ql_ban_hang
Mặc định Laravel đã có bảng users
khi migrate.
Chạy lệnh cmd sau:
php artisan migrate
Insert dữ liệu mẫu: Mở phpmyadmin, chọn CSDL ql_ban_hang
-> và tab SQL
và chạy lệnh insert
INSERT INTO users (`name`, `email`, `password`) VALUES ('Admin Root','demo@gmail.com','$2y$12$kDkHnLvmtALC7DIeFFdxtu/b8LRXZZEh9/0GWwgBkLGsdMdHzt7hm');
routes/web.php
use App\Http\Controllers\Admin\DashboardController;
use App\Http\Controllers\AuthController;
// Route login
Route::get('login', [AuthController::class, 'showLoginForm'])->name('login');
Route::post('login', [AuthController::class, 'login']);
Route::post('logout', [AuthController::class, 'logout'])->name('logout');
// Group admin với middleware auth
Route::prefix('admin')->middleware('auth')->group(function () {
Route::get('', [DashboardController::class, 'index'])->name('admin.dashboard');
});
php artisan make:controller AuthController
app/Http/Controllers/AuthController.php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class AuthController extends Controller
{
public function showLoginForm()
{
return view('auth.login');
}
public function login(Request $request)
{
$credentials = $request->validate([
'email' => 'required|email',
'password' => 'required'
]);
if (Auth::attempt($credentials)) {
$request->session()->regenerate();
return redirect()->intended('admin/dashboard');
}
return back()->withErrors([
'email' => 'Sai email hoặc mật khẩu',
]);
}
public function logout(Request $request)
{
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/login');
}
}
php artisan make:controller DashboardController
app/Http/Controllers/DashboardController.php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
class DashboardController extends Controller
{
public function index()
{
return view('admin.dashboard');
}
}
📄 resources/views/auth/login.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Đăng nhập</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
</head>
<body>
<div class="container" style="max-width:400px; margin-top:50px;">
<h3 class="text-center">Đăng nhập Admin</h3>
<form method="POST" action="{{ route('login') }}">
@csrf
<div class="form-group">
<label>Email</label>
<input type="email" name="email" class="form-control" value="{{ old('email') }}">
@error('email') <small class="text-danger">{{ $message }}</small> @enderror
</div>
<div class="form-group">
<label>Mật khẩu</label>
<input type="password" name="password" class="form-control">
@error('password') <small class="text-danger">{{ $message }}</small> @enderror
</div>
<button type="submit" class="btn btn-primary btn-block">Đăng nhập</button>
</form>
</div>
</body>
</html>
📄 resources/views/admin/dashboard.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Admin Dashboard</title>
</head>
<body>
<h1>Xin chào {{ auth()->user()->name }}</h1>
<form method="POST" action="{{ route('logout') }}">
@csrf
<button type="submit">Đăng xuất</button>
</form>
</body>
</html>
php artisan serve
http://127.0.0.1:8000/login
→ nhập email: admin@example.com
, mật khẩu: 123456
.admin/dashboard
.admin/dashboard
sẽ bị redirect về login.Nếu bạn muốn, mình có thể thêm middleware "admin" riêng để phân quyền chỉ cho user role=admin vào group này. Bạn có muốn mình viết thêm phần đó không?