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:
- 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. - 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.
- Vous devriez maintenant être en mesure de créer un projet!