推荐答案
在 Nest.js 中,可以通过在控制器或路由处理程序上使用 @UseGuards() 装饰器来应用守卫。守卫可以用于路由级别,以控制请求是否应该被处理。
// www.javascriptcn.com code example
import { Controller, Get, UseGuards } from '@nestjs/common';
import { AuthGuard } from './auth.guard';
@Controller('example')
export class ExampleController {
@Get('protected')
@UseGuards(AuthGuard)
getProtectedResource() {
return 'This is a protected resource';
}
}在这个例子中,AuthGuard 被应用到了 getProtectedResource 路由上,只有通过守卫的请求才能访问该路由。
本题详细解读
守卫的作用
守卫(Guards)是 Nest.js 中的一种特殊组件,主要用于在请求到达路由处理程序之前执行一些逻辑。守卫通常用于身份验证和授权,确保只有符合条件的请求才能继续处理。
路由级别应用守卫
在 Nest.js 中,守卫可以应用在控制器级别或路由级别。通过在路由处理程序上使用 @UseGuards() 装饰器,可以将守卫应用到特定的路由上。
1. 创建守卫
首先,你需要创建一个守卫类。守卫类需要实现 CanActivate 接口,并实现 canActivate 方法。该方法返回一个布尔值或一个 Promise<boolean>,表示请求是否应该被允许继续。
// www.javascriptcn.com code example
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();
// 在这里添加你的验证逻辑
return true; // 或 false
}
}2. 应用守卫
在控制器或路由处理程序上使用 @UseGuards() 装饰器来应用守卫。
// www.javascriptcn.com code example
import { Controller, Get, UseGuards } from '@nestjs/common';
import { AuthGuard } from './auth.guard';
@Controller('example')
export class ExampleController {
@Get('protected')
@UseGuards(AuthGuard)
getProtectedResource() {
return 'This is a protected resource';
}
}在这个例子中,AuthGuard 被应用到了 getProtectedResource 路由上。只有当 canActivate 方法返回 true 时,请求才会被允许继续处理。
全局守卫
如果你希望将守卫应用到所有路由,可以在模块级别使用 APP_GUARD 提供者。
// www.javascriptcn.com code example
import { Module } from '@nestjs/common';
import { APP_GUARD } from '@nestjs/core';
import { AuthGuard } from './auth.guard';
@Module({
providers: [
{
provide: APP_GUARD,
useClass: AuthGuard,
},
],
})
export class AppModule {}这样,AuthGuard 将会应用到所有的路由上。