Nâng CaoNestJS iconNestJS

RBAC (Role-Based Access Control) với custom Guards và Decorators trong NestJS?

RBAC cho phép kiểm soát quyền truy cập dựa trên role của user. Pattern chuẩn:

Bước 1: tạo @Roles() decorator:

typescript
export const Roles = (...roles: Role[]) => SetMetadata(ROLES_KEY, roles);

Bước 2: tạo RolesGuard:

typescript
@Injectable()
export class RolesGuard implements CanActivate {
  constructor(private reflector: Reflector) {}
  canActivate(ctx: ExecutionContext): boolean {
    const required = this.reflector.getAllAndOverride<Role[]>(ROLES_KEY, [
      ctx.getHandler(), ctx.getClass(),
    ]);
    if (!required) return true; // No roles required
    const { user } = ctx.switchToHttp().getRequest();
    return required.some(role => user.roles?.includes(role));
  }
}

Bước 3: đăng ký global và dùng:

typescript
@Roles(Role.ADMIN)
@Get('admin-only')
getAdminData() { ... }

Ngoài roles, có thể implement Permission-based (fine-grained) với casl library: ability.can(Action.Update, 'User').

Pitfall: guard chạy sau JWT guard — đảm bảo user object đã được attach vào request trước khi roles guard chạy.

Xem toàn bộ NestJS cùng filter theo level & chủ đề con.

Mở danh sách NestJS