NestJS 守卫
守卫(Guard)是 NestJS 核心的中间件层扩展,专注于授权(Authorization) 逻辑,决定一个请求是否能被路由处理器处理。它区别于中间件(通用预处理)、管道(参数验证 / 转换)、拦截器(请求 / 响应包装)和过滤器(异常处理),是实现权限控制、角色校验的核心组件。
生命周期位置
排第二位
守卫执行于中间件之后,因此能拿到中间件处理后的请求对象(如中间件解析的 JWT 载荷)
守卫执行于管道之前,因此不会触发参数验证 / 转换,避免无效计算
shell
客户端请求 --> 中间件 --> 守卫 --> 管道 --> 拦截器(前置) --> 控制器方法执行 --> 拦截器(后置) --> 异常过滤器 --> 返回响应最佳实践
- 守卫是第一个能访问完整请求上下文和路由元数据的组件,因此是授权逻辑的最佳载体。
- 单一职责:一个守卫只处理一种逻辑(如 JwtAuthGuard 负责认证,RolesGuard 负责角色鉴权)
- 语义化装饰器:封装 @Roles/@Permissions 等装饰器,避免直接使用 @SetMetadata;
- 缓存异步逻辑:异步守卫中数据库查询需加缓存(如 Redis),避免性能损耗;
- 全局 + 局部结合:全局守卫处理通用逻辑(如登录认证),局部守卫处理细分权限(如角色);
- 依赖注入优先:全局守卫通过 APP_GUARD 注册,而非 useGlobalGuards;
- 异常标准化:自定义异常统一格式,便于前端处理。
- 结合元数据:通过 Reflector 读取路由元数据(如角色、权限码),实现动态授权;
总结
shell
1. 作用
专注于「访问控制 / 权限校验」,在路由请求到达控制器(Controller)/ 处理器(Handler)之前执行,决定请求是否有权限继续向下处理
简单来说:守卫的核心是 “判断请求是否能通过”,是 NestJS 实现认证(Authentication)、授权(Authorization)的核心机制。
2. 调用时机
客户端请求 --> 中间件 --> 守卫 --> 管道 --> 拦截器(前置) --> 控制器方法执行 --> 拦截器(后置) --> 异常过滤器 --> 返回响应
3. 使用场景:
JWT 身份认证、角色授权(RBAC)、细粒度权限控制、多策略认证授权、IP 白名单守卫、接口访问频率限制
4. 特点
NestJS 守卫是基于 AOP(面向切面编程) 思想的核心中间层组件
5. 创建命令
nest g guard guard/roles
6. 应用级别(执行顺序:全局 > 控制器 > 路由> )
全局守卫
控制器守卫
路由级守卫