返回

Nest.js 路由守卫:打造安全可靠的应用程序

见解分享

Nest.js 路由守卫:保护您的应用程序

在现代 Web 应用程序中,安全性和授权至关重要。Nest.js 凭借其开箱即用的路由守卫机制脱颖而出,使开发人员能够轻松保护路由并执行授权检查。

路由守卫是什么?

路由守卫是一种特殊的拦截器,可以在路由处理之前或之后被执行。它们允许您在多个路由中执行常见的操作,例如身份验证、授权和日志记录。

创建路由守卫

要创建路由守卫,请使用 @Injectable()@CanActivate 装饰器:

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';

@Injectable()
export class AuthGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    // 实现身份验证逻辑...
  }
}

使用路由守卫

使用 @UseGuards() 装饰器将守卫应用到控制器或路由方法:

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

@Controller('protected')
export class ProtectedController {
  @Get()
  @UseGuards(AuthGuard)
  getProtectedData() {
    // 返回受保护的数据...
  }
}

类型守卫

Nest.js 支持类型守卫,允许您根据请求对象的类型创建更精细的守卫:

import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { isString } from 'class-validator';

@Injectable()
export class StringAuthGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const request = context.switchToHttp().getRequest();
    return isString(request.body.name);
  }
}

自定义错误处理

默认情况下,守卫在失败时会引发 ForbiddenException 异常。您可以自定义错误处理以提供更友好的消息:

import { Injectable, CanActivate, ExecutionContext, ForbiddenException } from '@nestjs/common';

@Injectable()
export class CustomAuthGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    // 实现身份验证逻辑...

    if (!isAuthenticated) {
      throw new ForbiddenException({
        message: 'Access denied.',
      });
    }

    return true;
  }
}

结论

Nest.js 路由守卫是一种强大的工具,可以增强应用程序的安全性。它们使您能够轻松保护路由、执行授权检查并改善应用程序架构。

常见问题解答

  1. 如何确定哪些路由需要守卫?
    考虑需要访问控制或身份验证的敏感或受限路由。

  2. 是否可以将多个守卫应用于同一个路由?
    是的,可以使用 @UseGuards() 装饰器将多个守卫应用于一个路由。

  3. 我可以在守卫中访问请求对象吗?
    是的,可以通过 context.switchToHttp().getRequest() 访问请求对象。

  4. 如何测试路由守卫?
    使用单元测试框架(例如 Jest)和依赖注入来测试守卫。

  5. Nest.js 中还有哪些其他类型的守卫?
    Nest.js 还提供了针对 HTTP 请求(例如 @UseFilters())和全局应用(例如 @Global())的其他类型的守卫。