守卫

方法额外信息添加

创建守卫

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

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

  canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
    // 获取路由处理器上设置的元数据
    const abc = this.reflector.get<string[]>('abc', context.getHandler())
    // 获取请求对象
    const req = context.switchToHttp().getRequest<Request>()
    // 打印调试信息
    console.log('守卫验证 - 元数据:', abc, '请求:', req)
    return true
  }
}

方法守卫

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

@Controller('cats')
export class CatsController {
  @Get()
  @UseGuards(AuthGuard, ) // 方法级别的守卫
  findAll() {
    return 'All cats';
  }
}

方法额外信息添加

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

@Controller('cats')
export class CatsController {
  @Get()
  @SetMetadata('abc',['admin'])
  findAll() {
    return 'All cats';
  }
}

控制器守卫

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

@Controller('cats')
@UseGuards(AuthGuard) // 控制器级别的守卫
export class CatsController {
  // 所有路由都会受到守卫保护
  @Get()
  findAll() {
    return 'All cats';
  }
}

全局守卫

app.useGlobalGuards(new LoginGuard())