在 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();