Bài 7: Xây dựng chức nằng đăng nhập trang quản trị admin trong laravel

Xây dựng chức nằng đăng nhập trang quản trị admin trong laravel

1. Đọc hiểu: Giới thiệu Authentication trong Laravel

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:

📌 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,
    ],
],

2 Thực hành: Tạo dữ liệu mẫu bảng users

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

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');

3. Khai báo Route Group cho Admin

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');
});

4. Tạo Controller AuthController

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');
    }
}

5. Tạo Controller DashboardController

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');
    }
}

6. Form Login với Bootstrap 3

📄 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>

7. View Dashboard

📄 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>

8. Chạy thử

php artisan serve

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?