[Bài đọc] Tự triển khai cơ chế xác thực

6. Bảo mật

Tất nhiên, bạn không bắt buộc sử dụng các authentication controller trong Laravel. Nếu bạn lựa chọn loại bỏ các controller này, bạn sẽ cần quản lý việc xác thực người dùng bằng cách sử dụng các lớp xác thực trực tiếp. Đừng lo lắng, vì điều đó là chắc chắn rồi!

Chúng ta sẽ truy cập vào các services xác thực của Laravel qua facade Auth, vị vậy chúng ta cần đảm bảo import facade Auth vào trong lớp. Tiếp theo, hãy kiểm tra phương thức attempt:

<?php
namespace App\Http\Controllers;

use Illuminate\Support\Facades\Auth;

class LoginController extends Controller
{
    /**
     * Handle an authentication attempt.
     *
     * @return Response
     */
    public function authenticate()
    {
        if (Auth::attempt(['email' => $email, 'password' => $password])) {
            // Authentication passed...

            return redirect()->intended('dashboard');
        }
    }
}

Phương thức attempt nhận vào một mảng các cặp key/value làm tham số đầu tiên. Các giá trị trong mảng này sẽ được dùng để tìm user trong cơ sở dữ liệu. Vì vậy trong ví dụ trên, giá trị của cột email được lấy ra từ thông tin người dùng. Nếu user không tồn tại, hashed password lưu trong cơ sở dữ liệu sẽ được dùng để so sánh với giá trị hashed password được truyền vào phương thức thông qua mảng. Nếu hai hashed password trùng nhau, một session sẽ được bắt đầu cho user.

Phương thức attempt sẽ trả về true nếu việc xác thực thành công. Ngược lại trả về false.

Phương thức intended trên redirector sẽ chuyển hướng user tới URL mà họ vừa truy cập trước khi bị bắt (intercepted) bởi authentication middleware. (The intended method on the redirector will redirect the user to the URL they were attempting to access before being intercepted by the authentication middleware.) Một fallback URI có thể được cho trước vào phương thức này trong trường hợp đích đến dự kiến không có.

Specifying Additional Conditions

Nếu muốn, bạn cũng có thể thêm những điều kiện mở rộng vào truy vấn xác thực cho email và mật khẩu của người dùng. Ví dụ, chúng ta có thể xác nhận xem user đã được đánh dấu là active

if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
    // The user is active, not suspended, and exists.

Lưu ý: Trong ví dụ này, email không phải là bắt buộc, nó được sử dụng như là một ví dụ. Bạn nên sử dụng những tên cột khác tương ứng với username trong cơ sở dữ liệu.

Accessing Specific Guard Instances

Bạn có thể chỉ đinh các đối tượng của guard để làm việc bằng cách sử dụng phương thức guard của façade Auth. Điều này cho phép bạn quản lý việc xác thực cho những thành phần khác nhau trong ứng dụng bằng cách sử dụng toàn bộ các model có khả năng xác thực tách biệt hoặc các bảng user.

Tên của guard truyền vào phương thức guard nên tương ứng với một trong các guard được cấu hình trong file auth.php:

if (Auth::guard('admin')->attempt($credentials)) {
    //

}

Đăng xuất (Logging Out)

Để đăng xuất người dùng khỏi ứng dụng, sử dụng phương thức logout của facade Auth. Việc này sẽ xóa toàn bộ thông tin xác thực trong session của người dùng:

Auth::logout();

Remembering Users

Nếu bạn muốn cung cấp chức năng “remember me” trong ứng dụng, bạn có thể truyền một giá trị boolean làm tham số thứ hai cho phương thức attempt, điều này cho phép người dùng xác thực vô thời hạn, hoặc cho đến khi họ tự thoát khỏi hệ thống. Tất nhiên, bảng user phải bao gồm cột remember_token, cột này được sử dụng để lưu token “remember me”

if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
    // The user is being remembered...

}

Lưu ý: Nếu sử dụng LoginController có sẵn trong Laravel, tính năng remember đã được thực hiện bởi trait trong controller.

Nếu bạn đang là người dùng được ghi nhớ, bạn sử dụng phương thức viaRemember để xác định nếu người dùng đã được xác thực sử dụng cookie “remember me”:

if (Auth::viaRemember()) {
    //

}

Leave a Reply

Your email address will not be published. Required fields are marked *