¿Hay alguna forma de usar las condiciones if al aplicar @UseGuards(JwtAuthGuard)
para un punto final en el controlador ?
@UseGuards(JwtAuthGuard) @Get("/foo/:bar?") async get(@Param() param: RequestParamDto)
Tener un punto final /foo
debería requerir un token de autorización JWT al llamarlo (lo que hace con el código anterior), pero cuando estamos pasando algo en un parámetro de solicitud, por ejemplo /foo/bar
, debería desactivar una protección .
No veo una forma de aplicar condiciones if-else al aplicar Guards en un nivel de controlador.
Puede aplicar condiciones if-else en guardias. Sin embargo, no a nivel del controlador, pero puede lograr la condición deseada siguiendo los siguientes pasos:
En primer lugar, defina un nuevo decorador con el siguiente código:
import { SetMetadata } from '@nestjs/common'; export const IS_PUBLIC_KEY = 'isPublic'; export const Public = () => SetMetadata(IS_PUBLIC_KEY, true);
Con este código, definirá un nuevo decorador con el nombre @Public()
. Y vincule IS_PUBLIC_KEY
al valor true
que, a su vez, estará vinculado al decorador. El propósito de su existencia es permitir que el guardia identifique a qué rutas desea que todos accedan.
El siguiente paso sería agregar el decorador a la ruta deseada:
@UseGuards(JwtAuthGuard) @Get("/foo/:bar") @Public() async get(@Param() param: RequestParamDto)
Finalmente, en la clase JwtAuthGuard deberías tener el siguiente código:
@Injectable() export class JwtAuthGuard extends AuthGuard('jwt') { constructor(private reflector: Reflector) { super(); } canActivate(context: ExecutionContext) { const isPublic = this.reflector.getAllAndOverride<boolean>(IS_PUBLIC_KEY, [ context.getHandler(), context.getClass(), ]); if (isPublic) { return true; } return super.canActivate(context); } }
En el código dentro de la función canActivate, ahora está utilizando la propiedad reflector de NestJs para obtener la constante IS_PUBLIC_KEY
agregada al decorador personalizado. Así, el vigilante podrá decirte cuándo quieres que la ruta sea pública para que todos puedan acceder.
Si desea obtener más información sobre este tema, consulte la documentación oficial aquí .