Nest.js

[Nest.js] 인증된 유저만 게시물 보고 쓸 수 있게 만들기

Hoo_Dev 2023. 1. 30. 16:58

유저에게 게시물 접근 권한 주기.

인증에 관한 모듈을 board 모듈에서 쓸 수 있어야 하기에 board module에서 인증 모듈 imports

(이렇게 한다면 AuthModule에서 export 하는 어떤 것이든 board Module에서 사용 가능)

// boards.module.ts에 AuthModule 추가

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AuthModule } from 'src/auth/auth.module';
import { Board } from './board.entity';
import { BoardRepository } from './board.repository';
import { BoardsController } from './boards.controller';
import { BoardsService } from './boards.service';

@Module({
  imports: [TypeOrmModule.forFeature([BoardRepository]), AuthModule],
  controllers: [BoardsController],
  providers: [BoardsService, BoardRepository],
  exports: [BoardsService],
})
export class BoardsModule {}

UseGuards(AuthGuard())를 이용하여 게시물 접근 권한 제공

UseGuards(AuthGuard())를 이용하여 유저가 요청을 줄 때 올바른 토큰으로 요청을 주는지 확인 후 게시물에 접근 할 권한을 준다. 그리고 이 AuthGuard는 각각의 라우트 별로 줄 수도 있고, 한번에 하나의 컨트롤러 안에 들어있는 모든 라우트에 줄 수 있다.

이번 방법은 board 컨트롤러 안에 있는 모든 라우트에 AuthGuard를 적용하려 한다.

// boards.controller.ts에 @UseGuards(AuthGuard()) 데코레이터 추가

@Controller('boards')
@UseGuards(AuthGuard())
export class BoardsController {
  constructor(private boardsService: BoardsService) {}

  @Get()
  getAllBoard(): Promise<Board[]> {
    return this.boardsService.getAllBoards();
  }

  @Get('/:id')
  getBoardById(@Param('id', ParseIntPipe) id: number): Promise<Board> {
    return this.boardsService.getBoardById(id);
  }

  @Post()
  @UsePipes(ValidationPipe)
  createBoard(@Body() createBoardDto: CreateBoardDto): Promise<Board> {
    return this.boardsService.createBoard(createBoardDto);
  }

  @Delete('/:id')
  deleteBoard(@Param('id', ParseIntPipe) id: number): Promise<void> {
    return this.boardsService.deleteBoard(id);
  }

  @Patch('/:id/status')
  updateBoardStatus(
    @Param('id', ParseIntPipe) id: number,
    @Body('status', BoardStatusValidationPipe) status: BoardStatus,
  ) {
    return this.boardsService.updateBoardStatus(id, status);
  }
}

해당 데코레이터를 boards 전체 라우트에 적용 시키게 된다면 이젠 토큰이 없을 때, 인증되지 않은 사용자로 처리가 된다.

{
    "statusCode": 401,
    "message": "Unauthorized"
}

이젠 헤더에 토큰을 넣은 후 요청을 해야 원하는 값을 가져올 수 있다.