Nest JS中的Strategy(策略)是什么?有何作用?
NestJS 中 Strategy 的定义与核心作用
你在JWT守卫实现里看到的Strategy,不是NestJS原生造的特殊概念,是Nest集成Passport.js认证生态时沿用的策略模式实现,不少教程跳过概念直接写代码,确实很容易让人搞不清它和Guard的边界。
核心定义
- Strategy是具体认证逻辑的封装单元:Nest的Guard本身只负责在路由请求流程里卡一道权限判断的入口,但不会硬编码具体的身份校验规则——是校验账号密码?还是校验JWT合法性?还是对接第三方平台的OAuth登录?这些差异化的认证逻辑,都会被拆成独立的Strategy类来实现。
- 所有基于Passport的Strategy都遵循统一的实现约定:只要你按规范写好配置项和固定的
validate()方法,Nest就会自动把这套逻辑接入到Guard的执行链路里,不需要你手动在Guard里写一堆分支判断逻辑。
核心作用
- 拆分认证逻辑,避免Guard代码臃肿。你完全可以给同一个项目写多套Strategy:比如给C端用户接口写JWT校验策略,给后台管理系统写账号密码登录的本地校验策略,给第三方系统对接写API密钥校验策略,各套逻辑互相独立,改其中一套不会影响其他认证流程。
- 自动处理通用校验流程,减少重复代码。以最常见的JWT Strategy举例,你只要在构造函数里配置好「从请求的哪个位置取token」「JWT签名密钥是什么」「要不要忽略过期时间」,Strategy会自动帮你完成:判断请求是否携带token、token格式是否符合要求、签名是否合法、是否在有效期内,这些通用步骤完全不需要你手写,校验不通过会直接返回401未授权响应,只有全部通用校验通过,才会进入你自定义的
validate()方法做业务层面的校验(比如查库确认用户是否存在、是否被封号)。
常见的JWT Strategy基础写法参考:@Injectable() export class JwtStrategy extends PassportStrategy(Strategy) { constructor() { super({ // 配置从请求头的Authorization字段取Bearer Token jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), secretOrKey: process.env.JWT_SECRET, ignoreExpiration: false, }); } // 固定约定的方法:JWT解密后的payload会自动作为入参传入 async validate(payload: { sub: number; username: string }) { // 这里写自定义校验逻辑,比如查库确认用户状态正常 return { userId: payload.sub, username: payload.username }; } } - 实现认证能力的可插拔。哪个路由需要用哪种认证方式,直接在
@UseGuards()装饰器里指定对应的策略标识就行,比如@UseGuards(AuthGuard('jwt'))就是给当前路由挂载JWT认证,@UseGuards(AuthGuard('local'))就是挂载本地账号密码认证,不需要改守卫本身的代码。
一个容易搞混的误区:Guard是Nest路由生命周期的内置拦截节点,负责拦截请求做权限判断;Strategy是插拔在Guard里的具体认证规则实现,两者是壳和内核的关系,不是同一层级的概念。
内容的提问来源于stack exchange,提问作者whenissummer
相关产品推荐
相关产品推荐

