Xử lý Authentication và Authorization trong Laravel
Trong Laravel, xử lý Authenticate (xác thực) và Authorize (phân quyền) là những bước quan trọng để bảo mật ứng dụng. Laravel cung cấp cho chúng ta nhiều công cụ để làm điều này, bao gồm middleware và gate.
Trong bài tôi sẽ giúp các bạn hiểu rõ hơn về Authentication và Authorization trong Laravel và sự khác nhau giữa Authentication và Authorization .Để qua bài viết bạn có thể hiểu rõ về Authentication và Authorization giúp chúng ta sử dụng mượt mà hơn khi chúng ta lập trình .
I. Authentication Laravel là gì ?
Authentication là quá trình xác thực danh tính của một người dùng hoặc một hệ thống để đảm bảo rằng họ có quyền truy cập vào một tài nguyên cụ thể hoặc thực hiện một hoạt động cụ thể.
Authentication trong Laravel thường được thực hiện bằng cách sử dụng middleware auth. Middleware này sẽ kiểm tra xem người dùng đã đăng nhập hay chưa, nếu chưa thì chuyển hướng người dùng đến trang đăng nhập. Nó làm việc thông qua Guard ,Provider, và Middleware:
Bài viết này được đăng tại [free tuts .net]
Để sử dụng middleware auth, bạn có thể đưa nó vào trong constructor của controller, ví dụ:
public function __construct() { $this->middleware('auth'); }
Hoặc bạn có thể đặt nó trực tiếp trên các route, ví dụ:
Route::get('/dashboard', function () { // })->middleware('auth');
1. Guard Authentication
Guard Authentication được sử dụng để xác thực người dùng và quản lý phiên đăng nhập. Laravel có một số guard mặc định, bao gồm "web" và "api", mỗi guard được cấu hình để sử dụng loại xác thực khác nhau.
Guard "web" được sử dụng cho các yêu cầu đến từ ứng dụng web và sử dụng phiên để lưu trữ thông tin đăng nhập của người dùng. Để sử dụng guard "web", bạn cần phải đảm bảo rằng tất cả các yêu cầu đến từ ứng dụng web được đi qua middleware "web".
Guard "api" được sử dụng cho các yêu cầu đến từ các ứng dụng di động hoặc ứng dụng JavaScript, sử dụng mã thông báo (token) để xác thực người dùng. Để sử dụng guard "api", bạn cần đảm bảo rằng tất cả các yêu cầu đến từ ứng dụng di động hoặc ứng dụng JavaScript được đi qua middleware "api".
Bạn cũng có thể tạo ra các guard tùy chỉnh bằng cách sử dụng phương thức "extend" trong service provider. Điều này cho phép bạn tạo các guard với các loại xác thực riêng biệt.
Ví dụ, để xác thực người dùng với guard "web", bạn có thể sử dụng phương thức "attempt" của guard như sau:
if (Auth::guard('web')->attempt(['email' => $email, 'password' => $password])) { // Người dùng đã đăng nhập thành công }
Còn để xác thực người dùng với guard "api", bạn có thể sử dụng mã thông báo như sau:
if (Auth::guard('api')->check()) { // Người dùng đã đăng nhập thành công với mã thông báo }
Laravel cung cấp nhiều cách khác nhau để quản lý xác thực và guard, tùy thuộc vào yêu cầu cụ thể của ứng dụng của bạn.
2. Provider Authentication
Provider Authentication là một tính năng quan trọng giúp xác thực người dùng và quản lý phiên làm việc. Nó được thực hiện thông qua các Provider, được định nghĩa trong file config/auth.php, bao gồm các loại như users, admins,...
Khi người dùng đăng nhập, Laravel sẽ tìm kiếm thông tin đăng nhập trong provider tương ứng. Nếu tìm thấy thông tin, nó sẽ tạo một phiên làm việc mới và trả về một token để xác thực người dùng. Phiên làm việc này sẽ được lưu trữ trong session của người dùng và sử dụng để xác minh các yêu cầu tiếp theo từ người dùng.
Để sử dụng Provider Authentication, trước hết ta cần đảm bảo rằng các model tương ứng đã được tạo và cấu hình trong file config/auth.php. Sau đó, ta có thể sử dụng các phương thức xác thực được cung cấp bởi Laravel như Auth::attempt() để xác thực người dùng, Auth::check() để kiểm tra xem người dùng đã đăng nhập chưa, Auth::user() để lấy thông tin người dùng đang đăng nhập, và nhiều phương thức khác.
Ví dụ, để xác thực một người dùng, ta có thể sử dụng đoạn mã sau:
if (Auth::attempt(['email' => $email, 'password' => $password])) { // Đăng nhập thành công } else { // Đăng nhập thất bại }
Trong đó, $email và $password là thông tin đăng nhập của người dùng. Nếu thông tin đúng, người dùng sẽ được đăng nhập thành công và phiên làm việc mới sẽ được tạo ra. Ngược lại, nếu thông tin không chính xác, đăng nhập sẽ thất bại và người dùng sẽ phải thử lại.
3. Middleware Authenticate
Middleware Authenticate là một middleware được sử dụng để xác thực người dùng trước khi cho phép họ truy cập vào một tài nguyên nào đó. Nó là một phần quan trọng của bảo mật trong ứng dụng Laravel.
Khi một người dùng cố gắng truy cập vào một tài nguyên được bảo vệ, ví dụ như trang quản trị hoặc tài liệu quan trọng, Middleware Authenticate sẽ kiểm tra xem người dùng đã đăng nhập hay chưa. Nếu người dùng đã đăng nhập, họ sẽ được cho phép truy cập vào tài nguyên. Nếu không, họ sẽ bị chuyển hướng đến trang đăng nhập hoặc nhận thông báo lỗi.
Laravel cung cấp sẵn một Middleware Authenticate mặc định được gọi là "auth". Để sử dụng Middleware Authenticate trong Laravel, bạn có thể đăng ký nó cho một tuyến (route) cụ thể hoặc cho toàn bộ ứng dụng bằng cách thêm nó vào nhóm middleware trong tệp kernel.php.
Ví dụ, để bảo vệ một tuyến (route) khỏi truy cập không xác thực, bạn có thể đăng ký Middleware Authenticate cho tuyến đó như sau:
Route::get('/dashboard', function () { // code của trang dashboard })->middleware('auth');
Khi người dùng cố gắng truy cập vào /dashboard, Middleware Authenticate sẽ được gọi và kiểm tra xem người dùng đã đăng nhập hay chưa. Nếu người dùng chưa đăng nhập, họ sẽ bị chuyển hướng đến trang đăng nhập. Nếu họ đã đăng nhập, họ sẽ được cho phép truy cập vào trang dashboard.
II. Authorization Laravel là gì ?
Authorization là quá trình kiểm tra xem một người dùng có được phép truy cập một tài nguyên cụ thể trong hệ thống hay không. Nó là một phần quan trọng của bảo mật trong ứng dụng, giúp đảm bảo rằng chỉ những người dùng có quyền được phép truy cập vào các tài nguyên quan trọng trong hệ thống.
Trong Laravel, "Authorization" thường được thực hiện thông qua các chính sách (policies) hoặc thông qua middleware được đặt tên là "authorization".
Các chính sách (policies) trong Laravel là các lớp được sử dụng để kiểm tra xem một người dùng có được phép thực hiện một hành động cụ thể đối với một tài nguyên trong hệ thống hay không. Ví dụ, một chính sách có thể kiểm tra xem một người dùng có quyền chỉnh sửa một bài viết hay không.
Middleware authorization là một middleware được sử dụng để kiểm tra quyền truy cập trước khi một người dùng được phép thực hiện một hành động cụ thể trong hệ thống. Nó sẽ kiểm tra các điều kiện cần thiết để đảm bảo rằng người dùng có quyền được phép truy cập trước khi cho phép họ thực hiện hành động đó.
Cả hai cách thực hiện "Authorization" đều rất quan trọng để đảm bảo tính bảo mật của ứng dụng Laravel của bạn.
1. Gate authorize
Gate là một hệ thống xác thực (authorization system) mạnh mẽ, cho phép bạn xác định những người dùng nào được phép thực hiện các hành động cụ thể trên ứng dụng của bạn. Ví dụ, bạn có thể sử dụng Gate để xác định liệu một người dùng có được phép chỉnh sửa một bài đăng, xóa một tài khoản hoặc truy cập một trang quản trị.
Để sử dụng Gate trong Laravel, bạn cần định nghĩa các chính sách (policies) cho các model và sử dụng các phương thức của Gate để kiểm tra quyền truy cập. Ví dụ, để kiểm tra xem một người dùng có được phép chỉnh sửa một bài đăng, bạn có thể sử dụng phương thức allows của Gate như sau:
if (Gate::allows('update-post', $post)) { // Người dùng có quyền chỉnh sửa bài đăng này }
Ở đây, update-post là tên của chính sách được định nghĩa cho model Post (ví dụ: PostPolicy), và $post là đối tượng bài đăng cần kiểm tra.
Để định nghĩa một chính sách, bạn cần tạo một class policy tương ứng với một model, ví dụ: nếu bạn có một model Post, bạn có thể tạo một class PostPolicy. Trong class này, bạn có thể định nghĩa các phương thức để kiểm tra quyền truy cập của người dùng, ví dụ:
class PostPolicy { public function update(User $user, Post $post) { return $user->id === $post->user_id; } }
Trong đoạn mã trên, phương thức update kiểm tra xem người dùng có được phép chỉnh sửa bài đăng hay không. Nếu người dùng là chủ sở hữu của bài đăng (tức là user_id của bài đăng trùng với id của người dùng), phương thức trả về true, cho phép người dùng chỉnh sửa bài đăng đó.
Sau khi bạn đã định nghĩa chính sách cho model, bạn có thể sử dụng phương thức authorization của controller để kiểm tra quyền truy cập trước khi thực hiện các hành động, ví dụ:
public function update(Request $request, Post $post) { $this->authorize('update', $post); // Xử lý chỉnh sửa bài đăng }
Trong đoạn mã trên, phương thức authorization sử dụng Gate để kiểm tra xem người dùng có được phép chỉnh.
2. Policy authorization
Policy là một cơ chế xác thực (authorization) cho phép bạn xác định quyền truy cập của người dùng vào các tài nguyên trên ứng dụng. Policy cho phép bạn định nghĩa các quy tắc để kiểm tra xem một người dùng có được phép thực hiện một hành động cụ thể trên một tài nguyên cụ thể hay không.
Để sử dụng Policy trong Laravel, bạn cần định nghĩa các Policy cho các Model của ứng dụng. Mỗi Policy sẽ định nghĩa một số phương thức để kiểm tra quyền truy cập của người dùng. Ví dụ, nếu bạn muốn kiểm tra xem một người dùng có được phép chỉnh sửa một bài đăng, bạn có thể tạo một phương thức update() trong Policy tương ứng với Model Post như sau:
class PostPolicy { public function update(User $user, Post $post) { return $user->id === $post->user_id; } }
Trong đoạn mã trên, phương thức update() kiểm tra xem người dùng có phải là chủ sở hữu của bài đăng hay không bằng cách so sánh id của người dùng với trường user_id của bài đăng. Nếu phương thức trả về true, người dùng sẽ được cho phép chỉnh sửa bài đăng đó.
Sau khi bạn đã định nghĩa Policy, bạn có thể sử dụng Policy để kiểm tra quyền truy cập của người dùng vào các tài nguyên trong ứng dụng. Ví dụ, để kiểm tra quyền truy cập của người dùng vào một bài đăng, bạn có thể sử dụng phương thức authorization() của controller như sau:
public function update(Request $request, Post $post) { $this->authorize('update', $post); // Xử lý chỉnh sửa bài đăng }
Trong đoạn mã trên, phương thức authorization() sử dụng Policy để kiểm tra quyền truy cập của người dùng vào bài đăng. Nếu Policy trả về giá trị true, người dùng sẽ được cho phép truy cập vào bài đăng và tiếp tục thực hiện các hành động tiếp theo. Nếu Policy trả về giá trị false, một ngoại lệ Illuminate\Auth\Access\AuthorizationException sẽ được ném ra và người dùng sẽ không được phép truy cập vào tài nguyên đó.
3. Ability authorize
Ability là một cơ chế xác thực (authorization) cho phép bạn xác định quyền truy cập của người dùng vào các hành động trên ứng dụng. Ability cho phép bạn định nghĩa các quy tắc để kiểm tra xem một người dùng có được phép thực hiện một hành động cụ thể hay không.
Ability được sử dụng phổ biến trong Laravel để kiểm tra quyền truy cập cho các hành động không liên quan đến Model. Ví dụ, nếu bạn muốn kiểm tra xem một người dùng có được phép tạo mới một bài đăng hay không, bạn có thể sử dụng Ability để kiểm tra.
Để sử dụng Ability trong Laravel, bạn cần định nghĩa các Ability. Mỗi Ability sẽ định nghĩa một số phương thức để kiểm tra quyền truy cập của người dùng. Ví dụ, nếu bạn muốn kiểm tra xem một người dùng có được phép tạo mới một bài đăng, bạn có thể tạo một phương thức create() trong Ability như sau:
class PostAbility { public function create(User $user) { return $user->can_create_post; } }
Trong đoạn mã trên, phương thức create() kiểm tra xem người dùng có quyền tạo mới bài đăng hay không bằng cách kiểm tra trường can_create_post của người dùng. Nếu phương thức trả về true, người dùng sẽ được cho phép tạo mới bài đăng.
Sau khi bạn đã định nghĩa Ability, bạn có thể sử dụng Ability để kiểm tra quyền truy cập của người dùng vào các hành động trong ứng dụng. Ví dụ, để kiểm tra quyền truy cập của người dùng vào hành động tạo mới bài đăng, bạn có thể sử dụng phương thức authorization() của controller như sau:
public function create(Request $request) { $this->authorize('create', Post::class); // Xử lý tạo mới bài đăng }
Trong đoạn mã trên, phương thức authorization() sử dụng Ability để kiểm tra quyền truy cập của người dùng vào hành động tạo mới bài đăng. Nếu Ability trả về giá trị true, người dùng sẽ được cho phép thực hiện hành động đó và tiếp tục thực hiện các hành động tiếp theo. Nếu Ability trả về giá trị false, một ngoại lệ Illuminate\Auth\Access\AuthorizationException sẽ được ném ra và người dùng sẽ không được phép thực
4. Role Authorization
Role authorization là một cơ chế xác thực trong Laravel cho phép bạn kiểm soát quyền truy cập của người dùng dựa trên vai trò (role) của họ trong hệ thống. Cơ chế này cho phép bạn xác định quyền truy cập vào các tài nguyên dựa trên vai trò được phân chia của người dùng, chẳng hạn như quản trị viên (admin), người dùng (user), khách hàng (customer), v.v.
Trong Laravel, bạn có thể sử dụng middleware để xác thực quyền truy cập của người dùng dựa trên vai trò của họ. Để sử dụng middleware này, bạn cần định nghĩa các vai trò và xác định quyền truy cập tương ứng với từng vai trò đó.
Để định nghĩa vai trò trong Laravel, bạn có thể sử dụng package như spatie/laravel-permission, cung cấp một số lớp và phương thức để thao tác với vai trò, quyền và người dùng.
Sau khi đã định nghĩa các vai trò, bạn có thể sử dụng middleware role trong Laravel để xác thực quyền truy cập của người dùng. Middleware này sẽ kiểm tra xem người dùng có được phép truy cập vào tài nguyên đó hay không dựa trên vai trò của họ. Ví dụ, để bảo vệ một tài nguyên và chỉ cho phép quản trị viên truy cập vào đó, bạn có thể sử dụng middleware role trong định nghĩa route như sau:
Route::get('/admin/dashboard', function () { // Truy cập được chỉ cho phép với vai trò "admin" })->middleware('role:admin');
Trong đoạn mã trên, middleware role:admin sẽ được sử dụng để kiểm tra quyền truy cập của người dùng vào tài nguyên /admin/dashboard. Middleware này chỉ cho phép người dùng có vai trò là "admin" truy cập vào tài nguyên này.
Nếu người dùng không có vai trò "admin", middleware sẽ quyết định không cho phép truy cập vào tài nguyên đó và trả về lỗi 403. Nếu người dùng có vai trò "admin", middleware sẽ cho phép truy cập vào tài nguyên và tiếp tục xử lý các yêu cầu tiếp theo.
II. Sự khác nhau giữa Authentication và Authorization
Authentication và Authorization là hai khái niệm liên quan đến bảo mật trong phần mềm.
Authentication (xác thực) là quá trình xác định tính xác thực của người dùng, tức là xác định xem người dùng là ai bằng cách yêu cầu họ nhập thông tin đăng nhập, chẳng hạn như tên người dùng và mật khẩu. Nếu thông tin đăng nhập chính xác, người dùng được xác nhận và cho phép truy cập vào hệ thống.
Authorization (xác thực quyền truy cập) là quá trình xác định quyền truy cập của người dùng sau khi đã xác thực. Tức là, sau khi xác định xem người dùng là ai, hệ thống cần xác định xem người dùng được phép truy cập vào các tài nguyên và chức năng nào trong hệ thống.
Một ví dụ để giải thích rõ hơn: Khi bạn đăng nhập vào một trang web, quá trình đăng nhập là một quá trình xác thực, nó sẽ xác định xem bạn có quyền truy cập vào hệ thống hay không. Nếu xác thực thành công, trang web sẽ xác định quyền truy cập của bạn, cho phép bạn truy cập vào một số tính năng nhất định (authorization). Ví dụ, nếu bạn là quản trị viên, bạn sẽ có quyền truy cập vào một số tính năng mà người dùng khác không thể truy cập được.
Tóm lại, Authentication và Authorization là hai khái niệm khác nhau nhưng liên quan chặt chẽ đến nhau. Authentication xác định tính xác thực của người dùng, còn Authorization xác định quyền truy cập của người dùng trong hệ thống. Cả hai đều là các yếu tố quan trọng trong bảo mật phần mềm.
Tổng kết
Trong bài viết này, chúng ta đã tìm hiểu về cách Laravel xử lý Authentication và Authorization, hai khái niệm cực kỳ quan trọng trong bảo mật phần mềm và sự khác nhau của chúng .
Laravel cung cấp nhiều công cụ và tính năng mạnh mẽ để xử lý Authentication và Authorization, bao gồm middleware, Gate, Policy và Role. Middleware cho phép bạn xác thực và xác định quyền truy cập cho các request trước khi chúng được xử lý bởi ứng dụng Laravel. Gate cho phép bạn định nghĩa các điều kiện và quy tắc để kiểm tra quyền truy cập cho các action trong ứng dụng của mình. Policy giúp bạn kiểm soát quyền truy cập cho các đối tượng trong ứng dụng, trong khi Role cho phép bạn quản lý quyền truy cập cho các user theo từng nhóm.
Nhờ các công cụ này, Laravel giúp chúng ta xử lý Authentication và Authorization một cách dễ dàng và hiệu quả. Việc xử lý chúng một cách đúng đắn không chỉ giúp bảo vệ dữ liệu và tài nguyên trong ứng dụng, mà còn giúp cải thiện trải nghiệm người dùng, tăng tính bảo mật và tránh được những rủi ro tiềm ẩn.
Tuy nhiên, để xử lý Authentication và Authorization trong Laravel một cách hiệu quả, chúng ta cần có kiến thức vững chắc về các khái niệm này cũng như các tính năng của Laravel. Hy vọng bài viết này đã giúp bạn hiểu rõ hơn về cách Laravel xử lý Authentication và Authorization và áp dụng chúng vào các ứng dụng của mình một cách chính xác.
Top 3 bài tutorialf hay về Laravel mà bạn nên tham khảo:
1. Cách phân quyền cho người dùng Authorization trong Laravel
Bài viết này chia sẻ về cách giúp ta phân quyền người dùng tốt hơn
Link bài viết : https://topdev.vn/blog/phan-quyen-nguoi-dung-voi-laravel-authorization/
2. Authentication trong Laravel có những gi ?
Nếu bạn cần tìm hiểu thêm về Authentication trong Laravel một cách riêng biệt thì xem qua bài này nó sẽ giúp bạn nhiều hơn đó
Link bài viết : https://vuvanlong.com/authentication-trong-laravel/
3. Phải làm sao để xây dựng được một bảo vệ Authentication trong Laravel
Link bài viết :https://code.tutsplus.com/vi/tutorials/how-to-create-a-custom-authentication-guard-in-laravel--cms-29667