Skip to content

NestJS 守卫

守卫(Guard)是 NestJS 核心的中间件层扩展,专注于授权(Authorization) 逻辑,决定一个请求是否能被路由处理器处理。它区别于中间件(通用预处理)、管道(参数验证 / 转换)、拦截器(请求 / 响应包装)和过滤器(异常处理),是实现权限控制、角色校验的核心组件。

生命周期位置

排第二位

守卫执行于中间件之后,因此能拿到中间件处理后的请求对象(如中间件解析的 JWT 载荷)

守卫执行于管道之前,因此不会触发参数验证 / 转换,避免无效计算

shell
客户端请求 --> 中间件 --> 守卫 --> 管道 --> 拦截器(前置) --> 控制器方法执行 --> 拦截器(后置) --> 异常过滤器 --> 返回响应

最佳实践

  1. 守卫是第一个能访问完整请求上下文和路由元数据的组件,因此是授权逻辑的最佳载体。
  2. 单一职责:一个守卫只处理一种逻辑(如 JwtAuthGuard 负责认证,RolesGuard 负责角色鉴权)
  3. 语义化装饰器:封装 @Roles/@Permissions 等装饰器,避免直接使用 @SetMetadata;
  4. 缓存异步逻辑:异步守卫中数据库查询需加缓存(如 Redis),避免性能损耗;
  5. 全局 + 局部结合:全局守卫处理通用逻辑(如登录认证),局部守卫处理细分权限(如角色);
  6. 依赖注入优先:全局守卫通过 APP_GUARD 注册,而非 useGlobalGuards;
  7. 异常标准化:自定义异常统一格式,便于前端处理。
  8. 结合元数据:通过 Reflector 读取路由元数据(如角色、权限码),实现动态授权;

总结

shell
1. 作用
   专注于「访问控制 / 权限校验」,在路由请求到达控制器(Controller)/ 处理器(Handler)之前执行,决定请求是否有权限继续向下处理
   简单来说:守卫的核心是 “判断请求是否能通过”,是 NestJS 实现认证(Authentication)、授权(Authorization)的核心机制。
2. 调用时机
   客户端请求 --> 中间件 --> 守卫 --> 管道 --> 拦截器(前置) --> 控制器方法执行 --> 拦截器(后置) --> 异常过滤器 --> 返回响应
3. 使用场景:
   JWT 身份认证、角色授权(RBAC)、细粒度权限控制、多策略认证授权、IP 白名单守卫、接口访问频率限制
4. 特点
   NestJS 守卫是基于 AOP(面向切面编程) 思想的核心中间层组件
5. 创建命令
   nest g guard guard/roles
6. 应用级别(执行顺序:全局 > 控制器 >>
   全局守卫
   控制器守卫
   路由级守卫