[NestJS] 8. Guards

Hannah·2023년 4월 14일
0

nestjs

목록 보기
8/9

1. Guard 클래스

구현 방법 1

@Injectable()
export class AuthGuard {
  async canActivate(context) {
    const request = context.switchToHttp().getRequest();
    return await validateRequest(request);
  }
}

구현 방법 2

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Observable } from 'rxjs';

@Injectable()
export class AuthGuard implements CanActivate {
  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    const request = context.switchToHttp().getRequest();
    return validateRequest(request);
  }
}

모든 가드는 canActivate()함수를 구현해야합니다. 이 함수는 현재 요청이 허용되는지 여부를 나타내는 조건값을 반환해야 합니다. 응답을 동기식 또는 비동기식으로 반환 할 수 있습니다 (Promise 또는 Observable을 통해). Nest는 리턴 값을 사용하여 다음 조치를 제어합니다.

  • true를 반환하면 요청이 처리
  • 'false'를 반환하면 Nest는 요청을 거부

2. ExcutionContext

  • ExecutionContextArgumentsHost를 확장하여 현재 실행 프로세스에 대한 추가 정보를 제공

3. 적용

적용 방법1 (함수)

@UseGuards(AuthGuard)
@Get('/:userId')
async getUser(@Param('userId') id: number) {
  const result = await this.userService.findUser(id);
  return ApiResponse.SUCCESS(result);
}
@UseGuard(new AuthGuard())
@Get('/:userId')
async getUser(@Param('userId') id: number) {
  const result = await this.userService.findUser(id);
  return ApiResponse.SUCCESS(result);
}

적용 방법2 (클래스)

@Controller('cats')
@UseGuards(new RolesGuard())
export class CatsController {}

적용 방법3 (전역 모듈 / main.ts)

const app = await NestFactory.create(AppModule);
app.useGlobalGuards(new RolesGuard());

warning 알림
하이브리드 앱의 경우 useGlobalGuards()메소드는 게이트웨이 및 마이크로 서비스에 대한 보호를 설정하지 않습니다. "표준"(하이브리드가 아닌) 마이크로 서비스 앱의 경우 useGlobalGuards()는 가드를 전역으로 마운트합니다.

적용 방법4 (모듈 / app.module.ts)

@Module({
  providers: [
    {
      provide: APP_GUARD,
      useClass: RolesGuard,
    },
  ],
})
export class AppModule {}
profile
backend developer

0개의 댓글