[Bài đọc] Cơ chế xác thực mặc định của Laravel

6. Bảo mật

Giới thiệu

Bạn có muốn bắt đầu nhanh không? Chỉ cần chạy lệnh php artisan make:auth và php artisan migrate trong một project mới. Khi đó, vào trình duyệt gõ địa chỉ http://your-app.dev/register hoặc bất kỳ URL được gán cho ứng dụng. Hai lệnh này sẽ sinh ra tất cả các file và cấu hình cần thiết để thiết lập cơ chế xác thực cho ứng dụng của bạn.

Laravel giúp cho việc thực hiện xác thực trở nên vô cùng đơn giản. Thực tế, hầu hết mọi thứ đã được cấu hình sẵn. Các thông tin cấu hình xác thực được đặt tại file config/auth.php, bao gồm một số hướng dẫn tùy biến cho việc tùy chỉnh cách xử lý của các dịch vụ xác thực.

Trong phần core của laravel, các cơ sở xác thực (authentication facilities) được tạo bởi guards và providers. Guards định nghĩa cách mà các user được xác thực cho mỗi request. Ví dụ, laravel mang theo một session guard để duy trì trạng thái bằng cách sử dụng session storage và cookies.

Provider định nghĩa cách mà các user được truy xuất từ persistent storage của bạn. Laravel hỗ trợ truy xuất các user sử dụng Eloquent và query builder. Tuy nhiên, bạn có thể thoải mái thêm provider nếu cần vào ứng dụng của bạn.

Đừng lo lắng nếu tất cả các điều này nghe có vẻ bối rối. Hầu hết các ứng dụng sẽ không cần điều chỉnh các cấu hình xác thực mặc định.

Những chú ý về cơ sở dữ liệu

Mặc định, Laravel thêm một model Eloquent App\User trong thư mục app của bạn. Model này có thể được sử dụng với Eloquent authentication driver mặc định. Nếu ứng dụng của bạn không sử dụng Eloquent, bạn có thể dùng database authentication driver sử dụng Laravel query builder.

Khi xây dựng cơ sở dữ liệu cho model App\User, phải đảm bảo rằng cột password có độ dài tối thiểu là 60 ký tự. Mặc định với 255 ký tự sẽ là lựa chọn tốt nhất.

Ngoài ra, bạn nên xác nhận bảng users (hoặc một bảng khác tương đương)  chứa cột giá trị có thể nhận giá trị null, cột remember_token chứa 100 ký tự. Cột này được dùng để lưu một token cho mỗi user khi đang được duy trì bởi ứng dụng của bạn.

Authentication Quickstart

Laravel có một vài authentication controller được xây dựng sẵn nằm trong thư mục App\Http\Controllers\Auth. Controller RegisterController xử lý đăng ký người dùng mới, trong khi LoginController xử lý việc xác thực, ForgotPasswordController xử lý gửi đường dẫn email để khôi phục mật khẩu và ResetPasswordController chứa thông tin để khôi phục mật khẩu. Mỗi controller có một số phương thức đặc trưng riêng. Đối với nhiều ứng dụng, bạn sẽ không cần phải sửa đổi toàn bộ các controller này.

Routing

Laravel cung cấp một cách nhanh chóng để sinh ra toàn bộ các route và view cần thiết cho việc xác thực với lệnh đơn giản như sau:

php artisan make:auth

Lệnh này nên được dùng trên các ứng dụng mới và sẽ cài đặt layout, view đăng ký và đăng nhập cũng như các route cho toàn bộ việc xác thực. Một HomeController cũng sẽ được sinh ra để xử lý các request post-login được gửi đến cho ứng dụng.

Views

Như đã đề cập ở phần trước, lệnh php artisan make:auth sẽ tạo toàn bộ các view cần thiết cho việc xác thực và đặt chúng trong thư mục resources/views/auth

Lệnh make:auth cũng tạo một thư mục resources/views/layouts bao gồm các layout cơ bản cho ứng dụng. Tất cả những view này đều sử dụng framework Bootstrap CSS, tuy nhiên bạn có thể sử dụng một framework khác nếu muốn.

Xác thực

Bây giờ bạn có các route và view chuẩn bị cho các authentication controller, bạn đã sẵn sàng để đăng ký và xác thức các user mới cho ứng dụng! Bạn chỉ cần truy cập vào ứng dụng qua trình duyệt khi authentication controller đã sẵn sàng để xác thực các user đã tồn tại và lưu user mới vào cơ sở dữ liệu.

Tùy chỉnh đường dẫn

Khi một user được xác thực thành công, họ sẽ được chuyển sang URL /home. Bạn có thể tùy chỉnh vị trí chuyển hướng này bằng cách sử dụng thuộc tính redirectTo của LoginController, RegisterController và ResetPasswordController:

protected $redirectTo = '/';

Lưu ý: Phương thức redirectTo sẽ được ưu tiên hơn thuộc tính redirectTo

Tùy chỉnh Username

Mặc định, Laravel sử dụng trường email để xác thực. Nếu bạn muốn tùy chỉnh lại điều này, bạn có thể tạo ra một phương thức username trong LoginController:

public function username()
{
    return 'username';
}

Tùy chỉnh Guard

Bạn có thể tùy chỉnh lại guard sử dụng để xác thực và đăng ký user. Để bắt đầu, định nghĩa một phương thức guard trong LoginController, RegisterController và ResetPasswordController. Phương thức này trả về một đối tượng guard:

use Illuminate\Support\Facades\Auth;

protected function guard()
{
    return Auth::guard('guard-name');
}

Tùy chỉnh Validation / Storage

Để thay đổi các trường trong form được yêu cầu khi người dùng mới đăng ký hoặc tùy chỉnh cách người dùng mới lưu vào cơ sở dữ liệu, bạn có thể sửa lớp RegisterController. Lớp này chịu trách nhiệm việc kiểm tra thông tin hợp lệ (validating) và tạo user mới trong ứng dụng.

Phương thức validator của RegisterController chứa những quy định validation cho người dùng mới. Bạn có thể thoải mái tùy chỉnh phương thức này nếu muốn.

Phương thức method của RegisterController chịu trách nhiệm tạo mới một bản ghi chứa thông tin người dùng (App\User) trong cơ sở dữ liệu bằng cách sử dụng Eloquent ORM. Bạn có thể thoải mải chỉnh sửa phương thức này nếu cần.

Lấy về đối tượng người dùng đã xác thực

Bạn có thể truy cận vào thông tin người dùng đã được xác thực thông qua facade Auth:

use Illuminate\Support\Facades\Auth;

// Get the currently authenticated user...

$user = Auth::user(); 

// Get the currently authenticated user's ID...

$id = Auth::id();

Ngoài ra, đối với mỗi một user được xác thực, bạn có thể truy cập thông tin xác thực của user đó qua đối tượng của Illuminate\Http\Request. Hãy nhớ rằng, lớp này sẽ được tự động đưa vào trong controller:

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ProfileController extends Controller
{
    /**
     * Update the user's profile.
     *
     * @param  Request  $request
     * @return Response
     */
    public function update(Request $request)
    {
        // $request->user() returns an instance of the authenticated user...
    }
}

Kiểm tra xem một người dùng đã xác thực hay chưa

Để xác định một user đã đăng nhập vào ứng dụng của bạn hay chưa, bạn có thể sử dụng phương thức check của facade Auth. Phương thức này sẽ trả về true nếu user đã được xác thực:

use Illuminate\Support\Facades\Auth; 

if (Auth::check()) {
    // The user is logged in...

}

Lưu ý: Mặc dù có thể xác định user đã được xác thực qua phương thức check, bạn có thể sử dụng một middleware để xác định user đã được xác thức trước khi cho phép user đó truy cập vào route hay controller nào đó. Để tìm hiểu thêm về điều này, hãy xem tài liệu tại protecting routes.

Bảo vệ các route

Route middleware có thể được sử dụng để xác thực người dùng truy cập vào route đã cho. Laravel mang tới một middleware (đã được định nghĩa trong Illuminate\Auth\Middleware\Authenticate). Khi middleware này đã thật sự được đăng ký trong HTTP kernel, toàn bộ những gì bạn cần là đính kèm middleware vào định nghĩa của route:

Route::get('profile', function () {
    // Only authenticated users may enter...

})->middleware('auth');

Tất nhiên, bạn có thể sử dụng controller, bạn có thể gọi phương thức middleware từ phương thức khởi tạo của controller thay vì gán nó trực tiếp trong route:

public function __construct()
{
    $this->middleware('auth');
}

Quy định một Guard

Khi gán một auth middleware vào route, bạn có thể chỉnh định guard nào sẽ được dùng để xác thực người dùng. Guard được chỉ định nên đáp ứng với một trong các key trong mảng guard của file cấu hình auth.php:

public function __construct()
{
    $this->middleware('auth:api');
}

Login Throttling

Nếu bạn cử dụng lớp LoginController có sẵn của Laravel, Illuminate\Foundation\Auth\ThrottlesLogins trait sẽ được thêm vào controller. Mặc định, user sẽ không thể đăng nhập trong một phút nếu họ thất bại trong việc cung cấp thông tin chính xác một vài lần. Việc throttling (điều phối) này là duy nhất với một username hay email và địa chỉ IP của user.

Leave a Reply

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