Authentication Trong Laravel Là Gì? Hoạt Động Của Nó Như Thế Nào?

Authentication Trong Laravel Là Gì? Hoạt Động Của Nó Như Thế Nào?
Laravel có tính năng cho phép chúng ta xác thực người dùng. Hoạt động cũng đơn giản nếu các bạn hiểu được authentication trong Laravel.

Các hệ thống website hoạt động trên Internet thường phải có tính năng xác thực người dùng. Tính năng này giúp cho các web nhận diện xem ai đang sử dụng hệ thống để điều hướng người dùng đến nhiều nguồn tài nguyên. Ngoài ra, nó cũng có tính năng bảo mật thông tin cùng với các nhóm thành viên khác nhau. Trước khi có Laravel, việc xác thực người dùng mất nhiều thời gian và công sức. Khi có Laravel, chuyện này trở nên đơn giản. 

 

Authentication trong Laravel là gì? 

 

Authentication (xác thực) là một hành động để thiết lập hoặc chứng thực điều gì đó uy tín trong Laravel. Authentication khác với authorization. Authorization là một quá trình xác minh hoặc nhận dạng của người dùng. Authentication là cho phép người dùng quyền được thực thi thao tác trên hệ thống. authentication đảm bảo truyền thông tin đến đúng nơi và người cần nhận. Hơn nữa, việc xác thực còn hỗ trợ người dùng thực thi đúng các chức năng trên hệ thống. 

 

Hai thành phần cốt lõi của Authentication trong Laravel 

 

Guard và Provider là 2 thành phần thiết yếu của authentication trong Laravel. 

 

Guard

 

Guard là nơi cung cấp một số thông tin logic để xác định người dùng đã được chứng thực hay chưa. Laravel có đa dạng guard, tiêu biểu nhất là session và token. Một session guard có nhiệm vụ duy trì trạng thái của người sử dụng trong mỗi request bằng cookie. Còn token guard thì chứng thực người dùng thông qua kiểm tra một loại token hợp lệ cho từng request. Guard xác định tính logic qua việc xác thực và không phải chứng thực bằng cách lấy các thông tin hợp lệ của back-end. Bạn chỉ cần triển khai một loại guard đơn giản bằng cách kiểm tra sự có mặt của thông tin cụ thể nằm ở header của request và sau đó xác thực người sử dụng. 

 

Providers 

 

Nếu guard là xác định tính logic thì provider có trách nhiệm lấy phần thông tin lưu trữ của back-end. Nếu guard yêu cầu người sử dụng phải chứng thực hợp lệ với bộ lưu trữ của back-end thì việc triển khai truy xuất người dùng sẽ chuyển tới provider để xác thực. Trong Laravel, có 2 provider chứng thực mặc định: database và eloquent. Provider của xác thực database là xử lý thông tin lấy trực tiếp của người dùng từ bộ lưu trữ của back-end. Eloquent có vai trò cung cấp 1 abstraction layer cần thiết để thực hiện việc chứng thực. 

 

Tổng quan về cách hoạt động của authentication trong Laravel 

 

Các bạn nên xem cách xác thực hoạt động của authentication như thế nào. Khi sử dụng một trình duyệt website, người sử dụng sẽ có username và password thông qua một biểu mẫu đăng nhập. Nếu các thông tin xác thực đó là đúng, ứng dụng sẽ lưu thông tin người dùng đã xác thực trong session của người dùng. Một cookie có chứa session ID sẽ được gửi đến trình duyệt để các request tiếp theo của ứng dụng trên web liên kết với người dùng qua session. Sau khi nhận session từ cookie trên trình duyệt, ứng dụng thu dữ liệu session dựa trên ID session.

 

Lưu ý thông tin xác thực khi đã được lưu trữ trong session và sẽ xem người dùng là đã xác thực. Một dịch vụ từ xa cần xác thực để truy cập vào API, cookie thường không được để xác thực vì thiếu trình duyệt web. Dịch vụ từ xa sẽ gửi API token đến API theo từng request. Ứng dụng có chức năng xác thực token được gửi đến dựa trên bảng API tokens hợp lệ và xác thực yêu cầu đang thực hiện bởi người dùng liên kết với API token đó. 

 

Cài đặt authentication 

 

Lấy ví dụ authentication với giao diện là bootstrap thì sẽ có các dòng lệnh này:  

 

composer require laravel/ui

php artisan ui bootstrap --auth

npm install

npm run dev

php artisan migrate

php artisan serve

Lấy thông tin của người dùng đang đăng nhập

 

use Illuminate\Support\Facades\Auth;


// lấy thông tin của người dùng hiện tại
$user = Auth::user();


// lấy id của người dùng hiện tại
$id = Auth::id();

 

Kiểm tra người dùng đã đăng nhập 

 

Để biết người dùng đã đăng nhập hoặc là chưa, bạn nên dùng hàm check(). Vì hàm này trả kết quả xác nhận về người dùng. 

 

use Illuminate\Support\Facades\Auth;

if (Auth::check()) {

    // The user is logged in...

}

 

Dù hàm check() hỗ trợ bạn kiểm tra xem người dùng đã đăng nhập hoặc chưa đăng nhập, nhưng nên dùng thêm middleware để xác thực người dùng trước khi cho phép truy cập vào các route và controller. 

 

Cách hạn chế đăng nhập 

 

Bạn cần bảo vệ các route để phục vụ cho các người dùng đã truy cập vào hệ thống bằng hàm middleware authentication. 

 

Route::get('profile', function () {

 // Chỉ những user đã đăng nhập mới được vào

})->middleware('auth');

 

Còn trong controller, bạn dùng hàm middleware trong constructor của controller và không nhất thiết phải gắn vào route như phía trên. 

 

public function __construct() {    

    $this->middleware('auth');

}

 

Cách đăng nhập thủ công 

 

Bạn cần thêm authentication facade vào phía trên của class:

 

use Illuminate\Support\Facades\Auth;

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use Illuminate\Support\Facades\Auth;

class LoginController extends Controller

{

    /**

     * Handle an authentication attempt.

     *

     * @param    \Illuminate\Http\Request  $request

     * @return  \Illuminate\Http\Response

     */

    public function login(Request $request)

    {

        $credentials = $request->validate([

            'email' => ['required', 'email'],

            'password' => ['required'],

        ]);

        if (Auth::attempt($credentials)) {

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

        }

        return back()->withErrors([

            'email' => 'The provided credentials do not match our records.',

        ]);

    }

}

 

Theo như đoạn code ở trên, method attempt nhận vào các cặp key/value để trở thành đôi số đầu tiên. Các value trong mảng này được sử dụng để tìm người dùng trong bảng users ở cơ sở dữ liệu mà bạn sở hữu. Trong ví dụ trên, user sẽ được truy xuất theo giá trị của cột email. Nếu tìm thấy user, password sẽ ở dạng hash lưu trữ trong cơ sở dữ liệu (sẽ được so sánh với password được truyền cho method attempt thông qua mảng). 

 

Bạn không nên động password của request đến vì Laravel sẽ tự động xử lý phần đó trước khi so sánh nó với password đã qua xử lý trong cơ sở dữ liệu. Phiên bản xác thực sẽ được bắt đầu cho người sử dụng nếu 2 password khớp với nhau. Các dịch vụ xác thực của Laravel sẽ truy xuất người sử dụng từ cơ sở dữ liệu của bạn theo cấu hình provider của bạn. Trong tập tin cấu hình config/auth.php mặc định, provider sử dụng Eloquent user và nó đã được hướng dẫn sử dụng model App\Models\User khi truy xuất người dùng. 

 

Các giá trị này có thể thay đổi được trong tập tin config tùy theo nhu cầu của bạn. Phương thức attempt thường sẽ trả về true nếu xác thực thành công. Nếu không, thì phương thức đó sẽ trả về false. 

 

Thêm một số điều kiện khi đăng nhập 

 

Bạn có thể bổ sung các điều kiện truy vấn vào phiên truy vấn xác thực ngoài email và mật khẩu của người dùng. Bạn chỉ cần thêm các điều kiện truy vấn vào mảng được truyền phương thức try. Ví dụ: 

 

if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {

    // Authentication was successful...

}

 

Lưu nhớ tên người sử dụng 

 

Một số ứng dụng web có cung cấp phần checkbox remember me trên biểu mẫu đăng nhập của chính họ. Nếu bạn muốn cung cấp chức năng này trong ứng dụng của mình, thì chuyển một giá trị Boolean làm đối số thứ 2 cho phương thức attempt. Khi giá trị này là true, Laravel sẽ giữ tính xác thực cho người dùng là vô thời hạn hoặc đến thời điểm mà họ đăng xuất thủ công. Bảng người dùng của bạn cần có cột chuỗi remember_token. Cột này dùng để lưu trữ mã thông báo nhớ đến tôi. Di chuyển bảng users sẽ kèm với các ứng dụng Laravel mới trong cột này:

 

if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {

    // Authentication was successful...

}

 

Cách đăng xuất thủ công

 

Để đăng xuất ứng dụng, bạn sử dụng phương pháp đăng xuất thủ công do Auth façade cung cấp. Thao tác sẽ giúp bạn xóa thông tin xác thực ra khỏi phiên của người dùng để các yêu cầu tiếp theo cũng không được xác thực.  Ngoài đăng xuất, bạn cũng nên vô hiệu hóa phiên sử dụng của người dùng và tạo lại mã thông báo CSRF của họ. Sau khi đăng xuất, bạn sẽ chuyển hướng người dùng đến thư mục gốc của ứng dụng: 

use Illuminate\Http\Request;

use Illuminate\Support\Facades\Auth;

/**

 * Log the user out of the application.

 *

 * @param    \Illuminate\Http\Request  $request

 * @return  \Illuminate\Http\Response

 */

public function logout(Request $request)

{

    Auth::logout();

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

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

    return redirect('/');

}

 

Sử dụng authentication trong Laravel không khó. Bạn có thể tích hợp nhanh vào các ứng dụng web đòi hỏi phải có bước xác thực. Laravel cung cấp một hệ thống xác thực nên nó hỗ trợ chúng ta xác thực nhiều thứ hơn, nếu muốn triển khai một bản tự xây dựng. 

Hồ Hữu Hiền

Mình là developer nên đôi khi viết bài không hay lắm mong các bạn thông cảm. Nếu muốn biết thêm thông tin về mình thì vui lòng vào website này để biết. https://huuhienqt.dev/

Bình luận (1)