Xác thực người dùng và quản lý đăng nhập bằng laravel

Post on: 2023-04-21 00:39:47 | in: Laravel
Để xác thực người dùng và quản lý đăng nhập trên trang tin tức của bạn, bạn có thể sử dụng tính năng xác thực (authentication) của Laravel.

Laravel cung cấp cho chúng ta các scaffold để dễ dàng thêm tính năng xác thực. Chúng ta sẽ sử dụng scaffold này để thêm tính năng xác thực vào trang tin tức.

Bước 1: Cài đặt Laravel UI package

composer require laravel/ui

Bước 2: Tạo scaffold cho xác thực

php artisan ui vue --auth

Lệnh trên sẽ tạo ra các file liên quan đến xác thực trong thư mục resources/views/auth và các file Auth controllers trong thư mục app/Http/Controllers/Auth.

Bước 3: Chạy migration để tạo bảng users

php artisan migrate

Bước 4: Sử dụng middleware để bảo vệ các route cần đăng nhập

Chúng ta có thể sử dụng middleware để bảo vệ các route cần đăng nhập. Middleware auth được Laravel cung cấp cho chúng ta để kiểm tra xem người dùng đã đăng nhập hay chưa.

Ví dụ:

Route::get('/dashboard', function () {
    return view('dashboard');
})->middleware(['auth'])->name('dashboard');

Như vậy, khi người dùng truy cập vào trang /dashboard, họ sẽ được chuyển đến trang đăng nhập nếu chưa đăng nhập và sẽ được chuyển đến trang /dashboard sau khi đăng nhập thành công.

Bước 5: Cấu hình định tuyến sau khi đăng nhập và đăng xuất

Khi người dùng đăng nhập thành công, chúng ta có thể cấu hình định tuyến để chuyển họ đến trang mong muốn. Laravel cung cấp cho chúng ta phương thức redirectTo để cấu hình định tuyến sau khi đăng nhập thành công.

Ví dụ:

protected function redirectTo()
{
    return route('dashboard');
}

Tương tự, khi người dùng đăng xuất, chúng ta có thể cấu hình định tuyến để chuyển họ đến trang đăng nhập.

Ví dụ:

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

Bước 6: Sử dụng tính năng xác thực trong view

Để hiển thị thông tin về người dùng đã đăng nhập trong view, chúng ta có thể sử dụng biến $auth được cung cấp bởi Laravel.

Ví dụ:

@if (Auth::check())
    <p>Hello, {{ Auth::user()->name }}</p>
@endif

Bước 7: Tùy chỉnh giao diện đăng nhập và đăng ký

Scaffold mặc định của Laravel UI sử dụng Bootstrap để thiết kế giao diện đăng nhập và đăng ký. Tuy nhiên, bạn có thể tùy chỉnh giao diện này để phù hợp với trang web của mình.

Để tùy chỉnh giao diện đăng nhập và đăng ký, bạn có thể chỉnh sửa các file trong thư mục resources/views/authresources/views/layouts/app.blade.php.

Ví dụ, để thay đổi mẫu layout chung của trang web, bạn có thể chỉnh sửa file resources/views/layouts/app.blade.php.

Bước 8: Tùy chỉnh controller xác thực

Nếu bạn cần tùy chỉnh logic xác thực của mình, bạn có thể chỉnh sửa các file Auth controller được tạo ra bởi Laravel UI. Ví dụ, bạn có thể thêm các lệnh để xử lý sau khi người dùng đăng nhập hoặc đăng ký thành công.

Bước 9: Thêm tính năng xác thực bằng Socialite

Nếu bạn muốn cho phép người dùng đăng nhập bằng tài khoản mạng xã hội như Facebook hoặc Google, bạn có thể sử dụng Laravel Socialite.

Để sử dụng Laravel Socialite, bạn cần cài đặt package laravel/socialite và cấu hình nó với tài khoản mạng xã hội của bạn.

Ví dụ, để cho phép người dùng đăng nhập bằng tài khoản Google, bạn có thể làm như sau:

Bước 9.1: Cài đặt package

composer require laravel/socialite

Bước 9.2: Thêm cấu hình vào file config/services.php

'google' => [
    'client_id' => 'your-google-client-id',
    'client_secret' => 'your-google-client-secret',
    'redirect' => 'http://your-app.com/callback-url',
],

Bước 9.3: Thêm route để chuyển hướng đến trang đăng nhập bằng Google

Route::get('/login/google', [App\Http\Controllers\Auth\LoginController::class, 'redirectToGoogle'])->name('login.google');

Bước 9.4: Thêm phương thức redirectToGoogle vào file app/Http/Controllers/Auth/LoginController.php

public function redirectToGoogle()
{
    return Socialite::driver('google')->redirect();
}

Bước 9.5: Thêm route để xử lý callback từ Google

Route::get('/login/google/callback', [App\Http\Controllers\Auth\LoginController::class, 'handleGoogleCallback']);

Bước 9.6: Thêm phương thức handleGoogleCallback vào file app/Http/Controllers/Auth/LoginController.php

public function handleGoogleCallback()
{
    try {
        $user = Socialite::driver('google')->user();
    } catch (Exception $e) {
        return redirect()->route('login')->with('error', 'Đăng nhập thất bại, vui lòng thử lại!');
    }

    // Check if user already exists
    $existingUser = User::where('email', $user->email)->first();

    if($existingUser){
        auth()->login($existingUser, true);
    } else {
        // Create a new user if not exist
        $newUser = new User;
        $newUser->name = $user->name;
        $newUser->email = $user->email;
        $newUser->google_id = $user->id;
        $newUser->save();

        auth()->login($newUser, true);
    }

    return redirect()->route('home');
}
 

Trong ví dụ trên, chúng ta kiểm tra xem người dùng đã đăng ký trên trang web chưa bằng cách tìm kiếm người dùng có email tương tự trong cơ sở dữ liệu. Nếu người dùng đã đăng ký, chúng ta đăng nhập người dùng vào trang web bằng phương thức auth()->login(). Nếu người dùng chưa đăng ký, chúng ta lưu thông tin người dùng vào cơ sở dữ liệu và đăng nhập người dùng vào trang web.

Bước 10: Kiểm tra phân quyền người dùng

Sau khi xác thực người dùng và đăng nhập vào trang web, bạn có thể kiểm tra quyền truy cập của người dùng để hiển thị các tính năng phù hợp.

Laravel cung cấp phương thức auth() để kiểm tra xem người dùng đã đăng nhập hay chưa. Bạn có thể sử dụng phương thức này để kiểm tra quyền truy cập của người dùng.

Ví dụ, để kiểm tra xem người dùng có quyền truy cập vào trang quản trị hay không, bạn có thể sử dụng code sau:

if (auth()->check() && auth()->user()->is_admin) {
    // Hiển thị các tính năng cho quản trị viên
} else {
    // Hiển thị các tính năng cho người dùng thông thường
}

Trong ví dụ trên, chúng ta kiểm tra xem người dùng đã đăng nhập hay chưa bằng phương thức auth()->check() và kiểm tra xem người dùng có thuộc nhóm quản trị viên hay không bằng cách truy cập thuộc tính is_admin