Aller au contenu principal

41-2 Protection des routes selon le rôle

Pour protéger certaines routes en fonction du rôle, on peut se créer un autre Guard que nous pourrons ajouter aux fonctions de contrôleur à protéger.

Par exemple, voici un un guard qui vérifie que l'utilisateur a le rôle demandé.

src/auth/guards/role.guard.ts
import { CanActivate, ExecutionContext, mixin, Type } from '@nestjs/common';
import { Role } from '../../utilisateurs/entities/role.enum';

export const RoleGuard = (role: Role): Type<CanActivate> => {
class RoleGuardMixin implements CanActivate {
async canActivate(context: ExecutionContext) {
const request = context.switchToHttp().getRequest();
const user = request.user;

return user.role === role;
}
}

return mixin(RoleGuardMixin);
};

Protection d'une route en fonction du rôle

Il devient maintenant possible de protéger certaines routes qui ne devraient pas être accessibles à tous. Par exemple, pour ajouter un projet, nous pourrions protéger cette fonction et la rendre accessible seulement aux administrateurs.

src/projets/projets.controller.ts
  @ApiCreatedResponse({
type: Projet,
})
@Post()
@UseGuards(RoleGuard(Role.Admin))
create(@Body() createProjetDto: CreateProjetDto) {
return this.projetsService.creer(createProjetDto);
}

Pour tester:

  1. Essayez de créer un projet avec le jeton d'un utilisateur qui a comme rôle "utilisateur" dans la base de données. Vous devriez obtenir une erreur d'autorisation 403 Forbidden.
  2. Ensuite, modifiez directement dans la base de données, à l'aide de votre outil favori, le rôle de l'utilisateur pour "admin" et réessayez.
  3. Vous devriez maintenant être en mesure de créer un projet!