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
canActivateretournetrue: La porte s'ouvre, la requête continue. - Si
canActivateretournefalse: 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() { ... }