Laravel – Authentication & Authorization

2 min read


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:

SanctumPassport
NhẹPhức tạp hơn
Token đơn giảnOAuth2 đầy đủ
Phù hợp SPAPhù 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

Avatar photo

Leave a Reply

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