【Nest】守卫

2021/09/07 14:15:43

守卫是一个使用 @Injectable() 装饰器的类。 守卫应该实现 CanActivate 接口。

守卫在每个中间件之后执行,但在任何拦截器或管道之前执行。

在守卫中可以获取 request 请求对象。

定义守卫

守卫可以直接返回 false 也可以抛出异常。

  • auth.guard.ts
import {
  Injectable,
  CanActivate,
  ExecutionContext,
  HttpException,
} 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();
    throw new HttpException("sdf", 400);
    return false;
  }
}

绑定守卫

使用 @UseGuards() 装饰器绑定守卫。

根据绑定位置不同分为方法范围、控制器范围和全局范围。

  • app.controller.ts
import { Controller, All, UseGuards } from "@nestjs/common";
import { AuthGuard } from "./guard/auth.guard";
@Controller()
export class AppController {
  @All()
  @UseGuards(AuthGuard)
  findAll() {
    return "htllo world";
  }
}

绑定全局守卫

  • main.ts
import { AuthGuard } from "./guard/auth.guard";
const app = await NestFactory.create(AppModule);
app.useGlobalGuards(new AuthGuard());