본문 바로가기

Nestjs

Guards

@Injectable() 데코레이터로 주석이 달린 클래스.

CanActivate인터페이스를 구현해야한다 .

가드는 각 미들웨어 이후 , 인터셉터 또는 파이프 전에 실행된다.


Authorization guard

토큰을 추출하고 유효성을 검사하고 추출 된 정보를 사용하여 요청을 진행할 수 있는지 여부를 결정.

auth.guard.ts

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);
  }
}

Role-based authentication

현재로서는 모든 요청을 진행할 수 있다.

role.guard.ts

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

@Injectable()
export class RolesGuard implements CanActivate {
  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    return true;
  }
}

Binding guards

@UseGuards()데코레이터를 사용

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

전역 가드: useGlobalGuards()

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

Reflection

cats.controller.ts

@Post()
@Roles('admin')
async create(@Body() createCatDto: CreateCatDto) {
  this.catsService.create(createCatDto);
}

Putting it all together

role.guard.ts

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

@Injectable()
export class RolesGuard implements CanActivate {
  constructor(private readonly reflector: Reflector) {}

  canActivate(context: ExecutionContext): boolean {
    const roles = this.reflector.get<string[]>('roles', context.getHandler());
    if (!roles) {
      return true;
    }
    const request = context.switchToHttp().getRequest();
    const user = request.user;
    const hasRole = () => user.roles.some((role) => roles.includes(role));
    return user && user.roles && hasRole();
  }
}

'Nestjs' 카테고리의 다른 글

Pipes  (0) 2019.11.05
Middleware  (0) 2019.11.05
Modules  (0) 2019.11.05
Providers  (0) 2019.11.05
Controller  (0) 2019.11.05