Skip to content

NestJS 守卫绑定方式

NestJS守卫支持路由守卫、控制器守卫、全局守卫

路由级守卫

通过 @UseGuards() 装饰在单个路由方法上,仅对该路由生效(如上文示例)。

ts
@Controller('user')
@Roles('user') // 全局角色(可被路由级 @Roles 覆盖)
export class UserController {
  @Get()
  getUsers() {
    /* ... */
  }

  @Get(':id')
  @UseGuards(RolesGuard) // 控制器下所有路由都需角色校验
  @Roles('admin') // 覆盖控制器级别,需 admin 角色
  getUserById() {
    /* ... */
  }
}

控制器守卫

装饰在控制器类上,对该控制器下所有路由生效:

ts
@Controller('user')
@UseGuards(RolesGuard) // 控制器下所有路由都需角色校验
@Roles('user') // 全局角色(可被路由级 @Roles 覆盖)
export class UserController {
  @Get()
  getUsers() {
    /* ... */
  }

  @Get(':id')
  @Roles('admin') // 覆盖控制器级别,需 admin 角色
  getUserById() {
    /* ... */
  }
}

全局守卫

对所有路由生效,有两种注册方式:

  1. 方式一:通过 providers 注册(推荐,支持依赖注入)
ts
// src/app.module.ts
import { Module } from '@nestjs/common';
import { APP_GUARD } from '@nestjs/core';
import { RolesGuard } from './guards/roles.guard';

@Module({
  providers: [
    {
      provide: APP_GUARD,
      useClass: RolesGuard, // 全局守卫
    },
  ],
})
export class AppModule {}
  1. 方式二:通过 NestFactory 注册(不支持依赖注入)
ts
// src/main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { RolesGuard } from './guards/roles.guard';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  // 全局注册(但无法注入模块内的服务,如 Reflector 需手动传)
  app.useGlobalGuards(new RolesGuard(app.get(Reflector)));
  await app.listen(3000);
}
bootstrap();