@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 |