Authentication vs Authorization trong Laravel
Rất nhiều developer nhầm lẫn 2 khái niệm:
- Authentication → Bạn là ai?
- Authorization → Bạn được phép làm gì?
Laravel hỗ trợ cả hai cực mạnh, nhưng nếu không hiểu rõ, bạn dễ:
- Gắn middleware sai chỗ
- Lạm dụng role hardcode
- Viết logic kiểm tra quyền rải rác
Tài liệu chính thức:
👉 https://laravel.com/docs/authentication
1️⃣ Authentication trong Laravel
Laravel cung cấp nhiều cách:
- Session-based (web)
- Token-based (API)
- OAuth
- JWT (custom)
Session-based Authentication
Phù hợp:
- Web app truyền thống
- Dashboard admin
Laravel lưu session trong:
- File
- Database
- Redis
Cấu hình tại:
config/auth.php
API Authentication
Cho REST API, mobile app, SPA.
Laravel cung cấp: Laravel Sanctum hoặc Laravel Passport
So sánh nhanh:
| Sanctum | Passport |
|---|---|
| Nhẹ | Phức tạp hơn |
| Token đơn giản | OAuth2 đầy đủ |
| Phù hợp SPA | Phù hợp hệ thống lớn |
Docs Sanctum:
👉 https://laravel.com/docs/sanctum
2️⃣ Guard – Cơ chế phân tách Authentication
Laravel cho phép nhiều guard.
Ví dụ:
'guards' => [
'web' => [...],
'api' => [...],
'admin' => [...]
];
Bạn có thể:
auth('admin')->user();
Use case:
- User frontend
- Admin backend
- API client
3️⃣ Authorization – Phân quyền trong Laravel
Laravel có 2 cơ chế chính:
- Gate
- Policy
Docs:
👉 https://laravel.com/docs/authorization
Gate – Kiểm tra quyền đơn giản
Ví dụ:
Gate::define('edit-post', function ($user, $post) {
return $user->id === $post->user_id;
});
Dùng khi:
- Kiểm tra quyền nhỏ
- Logic đơn giản
Policy – Dành cho Model
Tạo policy:
php artisan make:policy PostPolicy
Ví dụ:
public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}
Dùng trong controller:
$this->authorize('update', $post);
Policy giúp:
✔ Tách logic phân quyền
✔ Clean controller
✔ Dễ test
4️⃣ Role-Based Access Control (RBAC)
Khi hệ thống lớn, bạn cần RBAC.
Ví dụ roles:
- Admin
- Manager
- User
Không nên hardcode:
if ($user->role === 'admin')
Nên tạo permission table:
- roles
- permissions
- role_permission
Hoặc dùng package:
Spatie Laravel Permission
Package này giúp:
- Quản lý role linh hoạt
- Gán permission động
- Middleware tích hợp sẵn
5️⃣ Middleware Authorization
Bạn có thể dùng middleware:
Route::middleware(['auth', 'can:update,post'])->group(...)
Hoặc:
Route::middleware(['role:admin'])->group(...)
Middleware giúp:
- Kiểm tra trước khi vào controller
- Tránh duplicate logic
6️⃣ Multi-Tenant Authorization
Khi làm SaaS:
- User thuộc organization
- Mỗi organization có dữ liệu riêng
Bạn nên:
- Dùng Global Scope
- Check tenant_id trong policy
- Không tin tưởng input từ request
Đây là lỗi phổ biến gây data leak.
Checklist Bảo Mật Laravel Production
- Sử dụng HTTPS
- Hash password (bcrypt mặc định)
- Không expose token
- Dùng CSRF protection
- Phân quyền bằng policy
Kết luận
Authentication giúp xác định người dùng.
Authorization quyết định họ được làm gì.
Laravel cung cấp:
- Guard
- Sanctum / Passport
- Gate
- Policy
- Middleware
Khi dùng đúng cách, bạn sẽ có hệ thống:
✔ An toàn
✔ Clean
✔ Dễ scale
✔ Dễ test
