Aller au contenu principal

Guards : La Sécurité

Les Guards ont une responsabilité unique : déterminer si une requête doit être traitée par le route handler ou non. C'est le Videur 🦍 à l'entrée de ton endpoint.

Ils sont principalement utilisés pour gérer l'autorisation (Permissions, Rôles, ACL).

Comment ça marche ?

Un Guard est une classe qui implémente l'interface Guard. Elle doit posséder une méthode canActivate.

  • Si canActivate retourne true : La porte s'ouvre, la requête continue.
  • Si canActivate retourne false : La porte reste fermée. Le framework renvoie automatiquement une erreur 403 Forbidden.

Créer un Guard

La grande force des Guards dans my-fastify-decorators, c'est qu'ils sont injectables. Tu peux donc utiliser tes Services (comme AuthService ou UserService) à l'intérieur pour vérifier un token en base de données.

import { Guard, CanActivateContext, Service, Inject } from 'my-fastify-decorators';

@Service() // Important pour l'injection !
export class RolesGuard implements Guard {

@Inject(UserService)
private userService!: UserService;

async canActivate(context: CanActivateContext): Promise<boolean> {
const { req } = context;

// 1. On récupère le user (ajouté précédemment par un middleware ou le handshake socket)
const user = (req as any).user;

if (!user) return false; // Pas d'user ? Dehors !

// 2. On vérifie ses droits via un service
const isAdmin = await this.userService.hasRole(user.id, 'ADMIN');

return isAdmin;
}
}

Utiliser un Guard (@UseGuards)

Tu peux placer un vigile devant une méthode spécifique, ou devant tout le contrôleur.

import { Controller, Get, UseGuards } from 'my-fastify-decorators';

@Controller('/admin')
@UseGuards(RolesGuard) // 🔒 Tout ce contrôleur est protégé
export class AdminController {

@Get('/dashboard')
getDashboard() {
return { sensitive: 'data' };
}
}

Ou juste sur une route :

@Get('/delete')
@UseGuards(RolesGuard) // 🔒 Juste cette route
deleteEverything() { ... }