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ụ:
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
@Roles
Sử dụng RolesGuard và @Roles trong Controller
Ở ví dụ trên:
JwtAuthGuard
sẽ kiểm tra xác thực JWT và thêm thông tin user vào request.RolesGuard
sẽ 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
role
trong 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/dashboard
chỉ cho phépadmin
truy cập.Bảo vệ route
/admin/profile
cho phépadmin
vàmoderator
truy cập.Test thử với các user có role khác nhau qua Postman hoặc curl.
(Optional) Tạo route
/user/profile
cho 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ờ
Reflector
và metadataCần kết hợp tốt giữa xác thực (Auth) và phân quyền (Authorization)
Last updated