Class 08: Authorization – Phân quyền
Authorization (phân quyền) là quá trình xác định xem người dùng đã xác thực có quyền truy cập tài nguyên, thực hiện hành động hay không. Trong nhiều ứng dụng, chúng ta cần phân biệt quyền của user dựa trên vai trò (role) khác nhau.
Gán vai trò (role) cho user
Vai trò (role) là gì?
Role là nhóm quyền hoặc cấp độ phân quyền gán cho user. Ví dụ:
admin: có quyền toàn bộ hệ thốnguser: quyền giới hạn, chỉ truy cập chức năng cơ bảnmoderator: quyền trung gian...
Gán role cho user trong database
Thông thường, trường role sẽ được thêm vào entity User. Ví dụ:
// user.entity.ts
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
username: string;
@Column()
password: string;
@Column()
role: string; // Ví dụ: 'admin', 'user', 'moderator'
}Khi tạo user, bạn gán role phù hợp:
Tạo Guard kiểm tra role
Guard trong NestJS
Guard là lớp dùng để kiểm soát truy cập route, quyết định cho phép hoặc chặn dựa trên logic tùy chỉnh.
Guard phân quyền theo role
Ta sẽ viết một Guard để kiểm tra role của user từ request đã được xác thực (thông thường user info được lấy từ request.user sau khi xác thực JWT).
Custom Decorator cho @Roles
Metadata trong NestJS
Chúng ta dùng Reflect.metadata để gán metadata cho các route handler, dùng Reflector lấy ra trong Guard.
Tạo decorator @Roles
@RolesSử dụng RolesGuard và @Roles trong Controller
Ở ví dụ trên:
JwtAuthGuardsẽ kiểm tra xác thực JWT và thêm thông tin user vào request.RolesGuardsẽ kiểm tra vai trò user với decorator@Roles.
Ví dụ đầy đủ về phần auth có role
Giả sử result trả về có { id, username, role } thì trong JwtStrategy ta trả về thông tin này làm payload token:
Khi user gửi request kèm token, NestJS sẽ gán request.user có đủ trường role để RolesGuard dùng.
Bài tập thực hành
Thêm trường
roletrong entity User (vd: 'admin', 'user', 'moderator').Viết custom decorator
@Rolesđể gán role cho route.Viết
RolesGuardđể kiểm tra quyền user truy cập.Bảo vệ route
/admin/dashboardchỉ cho phépadmintruy cập.Bảo vệ route
/admin/profilecho phépadminvàmoderatortruy cập.Test thử với các user có role khác nhau qua Postman hoặc curl.
(Optional) Tạo route
/user/profilecho tất cả user đã đăng nhập đều truy cập được.
Tổng kết
Phân quyền là bước tiếp theo sau xác thực, giúp giới hạn truy cập theo vai trò người dùng
Custom decorator và Guard giúp xây dựng hệ thống phân quyền gọn, tái sử dụng cao
Thực hiện phân quyền dễ dàng với NestJS nhờ
Reflectorvà metadataCần kết hợp tốt giữa xác thực (Auth) và phân quyền (Authorization)
Last updated