You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 21:27:17