nestjs的Guard(守卫)

231 阅读1分钟

在 Nest.js 中,Guard(守卫)是一种用于保护路由端点的机制。类似于中间件,在请求到达路由处理程序之前,Guard 可以对请求进行拦截并在特定条件下允许或拒绝请求。

使用场景

守卫通常用于身份验证和授权,也就是在执行业务代码之前验证用户是否有权做出某个操作。

创建一个身份验证守卫

我们首先要创建一个 AuthGuard 类并注入它。这个类需要实现 CanActivate 接口并实现 canActivate 方法

nest g gu auth
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();
    // 添加你的身份验证逻辑
    // For example:
    return validateRequest(request);
  }
}

使用身份验证守卫(控制器维度)

只需要在控制器或者具体路由上添加 @UseGuards() 装饰器

import { Controller, Get, UseGuards } from '@nestjs/common';
import { AuthGuard } from './auth.guard';

@Controller('users')
@UseGuards(AuthGuard)
export class UserController {
  
  @Get()
  findAll() {
    return "这个操作返回所有的猫,只有通过身份验证的用户能看到!";
  }
}

使用身份验证守卫(路由维度)

如果只希望在某个特定的路由上应用这个守卫,而不是整个控制器,可以将 UseGuards 装饰器应用于具体的路由处理函数

import { Controller, Get, UseGuards } from '@nestjs/common';
import { AuthGuard } from './auth.guard';

@Controller('cats')
export class CatsController {
  
  @Get()
  @UseGuards(AuthGuard)
  findOne() {
    return "这个操作返回一只猫,只有通过身份验证的用户能看到!";
  }
}

全局使用守卫

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { AuthGuard } from 'src/guard/auth.guard';

async function bootstrap() {
    const app = await NestFactory.create(AppModule);
	app.useGlobalGuards(new AuthGuard()) // 全局守卫配置
	await app.listen(3000);
}
bootstrap();