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() {
/* ... */
}
}全局守卫
对所有路由生效,有两种注册方式:
- 方式一:通过 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 {}- 方式二:通过 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();