Laravel - Xác thực: Hướng dẫn cho người mới bắt đầu

Xin chào các bạnfuture Laravel developers! Hôm nay, chúng ta sẽ cùng bước vào thế giới thú vị của Laravel Authorization. Đừng lo lắng nếu bạn mới bắt đầu học lập trình - tôi sẽ là người bạn thân thiện dẫn đường cho bạn trong hành trình này, giải thích mọi thứ từng bước. Hãy bắt đầu nhé!

Laravel - Authorization

Hiểu về cơ bản: Xác thực vs. Xác nhận

Trước khi chúng ta nhảy vào các tính năng xác nhận của Laravel, hãy làm rõ một sự nhầm lẫn phổ biến:

Xác thực: Bạn là ai?

Hãy nghĩ về xác thực như bảo vệ ở câu lạc bộ. Đó là về việc chứng minh bạn là ai. Trong thế giới kỹ thuật số, điều này thường có nghĩa là đăng nhập với tên người dùng và mật khẩu.

Xác nhận: Bạn được phép làm gì?

Bây giờ, xác nhận giống như danh sách VIP. Khi bạn đã ở trong câu lạc bộ (đã xác thực), xác nhận sẽ quyết định bạn có thể truy cập vào哪些区域. Bạn có thể vào phòng VIP không? Bạn có được phép đứng sau bàn DJ không?

Trong Laravel, chúng ta trước tiên xác thực người dùng, sau đó chúng ta sử dụng xác nhận để kiểm soát những gì họ có thể làm trong ứng dụng của mình.

Cơ chế xác nhận trong Laravel

Laravel cung cấp một hệ thống xác nhận mạnh mẽ và linh hoạt. Hãy chia nhỏ nó thành các phần dễ tiêu hóa:

1. Cổng (Gates)

Cổng là những cách đơn giản dựa trên hàm để xác nhận hành động. Hãy nghĩ về chúng như các chốt kiểm tra trong ứng dụng của bạn.

Dưới đây là cách bạn xác định một cổng:

Gate::define('edit-post', function ($user, $post) {
return $user->id === $post->user_id;
});

Cổng này kiểm tra xem người dùng có được phép chỉnh sửa một bài viết hay không. Nó trả về true nếu ID của người dùng khớp với ID của tác giả bài viết.

Để sử dụng cổng này trong bộ điều khiển của bạn:

if (Gate::allows('edit-post', $post)) {
// Người dùng có thể chỉnh sửa bài viết...
}

Or trong các mẫu Blade:

@can('edit-post', $post)
<!-- Hiển thị nút chỉnh sửa -->
@endcan

2. Chính sách (Policies)

Chính sách là các lớp tổ chức logic xác nhận xung quanh một mô hình hoặc tài nguyên cụ thể. Chúng giống như các bảo vệ chuyên môn cho mỗi mô hình trong ứng dụng của bạn.

Hãy tạo một chính sách cho mô hình Post của chúng ta:

php artisan make:policy PostPolicy --model=Post

Lệnh này tạo ra một lớp PostPolicy. Hãy thêm một phương thức vào nó:

public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}

Bây giờ bạn có thể sử dụng chính sách này trong bộ điều khiển của bạn:

$this->authorize('update', $post);

Or trong các mẫu Blade:

@can('update', $post)
<!-- Hiển thị nút cập nhật -->
@endcan

3. Vai trò và quyền限 (Roles and Permissions)

Mặc dù Laravel không cung cấp hệ thống vai trò tích hợp sẵn, nhưng chúng ta có thể dễ dàng triển khai một hệ thống như vậy. Dưới đây là một ví dụ đơn giản:

Đầu tiên, hãy thêm cột 'role' vào bảng người dùng của chúng ta:

Schema::table('users', function (Blueprint $table) {
$table->string('role')->default('user');
});

Bây giờ, hãy tạo một cổng kiểm tra quyền admin:

Gate::define('admin', function ($user) {
return $user->role === 'admin';
});

Chúng ta có thể sử dụng này trong các bộ điều khiển hoặc giao diện người dùng:

if (Gate::allows('admin')) {
// Người dùng là admin...
}
@can('admin')
<!-- Hiển thị liên kết bảng điều khiển admin -->
@endcan

4. Middleware

Laravel cũng cho phép bạn kiểm soát truy cập ở cấp route bằng cách sử dụng middleware. Hãy tạo một middleware tùy chỉnh:

php artisan make:middleware CheckRole

Trong phương thức handle của middleware này:

public function handle($request, Closure $next, $role)
{
if (! $request->user()->hasRole($role)) {
abort(403, 'Unauthorized action.');
}

return $next($request);
}

Đăng ký middleware này trong app/Http/Kernel.php:

protected $routeMiddleware = [
// ...
'role' => \App\Http\Middleware\CheckRole::class,
];

Bây giờ bạn có thể sử dụng nó trong các route của bạn:

Route::get('/admin', function () {
//
})->middleware('role:admin');

Bảng phương thức

Dưới đây là bảng tiện ích của các phương thức chính chúng ta đã xem xét:

Phương thức Mô tả Ví dụ
Gate::define() Định nghĩa một cổng xác nhận mới Gate::define('edit-post', function ($user, $post) { ... })
Gate::allows() Kiểm tra xem một cổng cho phép hành động hay không Gate::allows('edit-post', $post)
$this->authorize() Xác nhận một hành động trong bộ điều khiển $this->authorize('update', $post)
@can Đạo cụ Blade cho xác nhận @can('update', $post) ... @endcan
Gate::forUser() Lấy một instance cổng cho người dùng cụ thể Gate::forUser($user)->allows('edit-post', $post)

Nhớ rằng, xác nhận là về việc kiểm soát những gì người dùng đã xác thực có thể làm trong ứng dụng của bạn. Đó là một phần quan trọng của việc xây dựng các ứng dụng web an toàn và thân thiện với người dùng.

Khi bạn gyak và xây dựng nhiều ứng dụng hơn, bạn sẽ cảm thấy thoải mái hơn với các khái niệm này. Đừng ngại thử nghiệm - đó là cách chúng ta học hỏi!

Chúc các bạn may mắn, các chuyên gia Laravel tương lai! ??‍??‍?

Credits: Image by storyset