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

NestJS全局守卫注入Service实现授权绕过方案咨询

NestJS 绕过Azure AD授权实现方案

1. 修改全局AuthorizationGuard,注入UsersService

直接在现有守卫中扩展逻辑,先判断请求头是否存在isbypass,存在则走自定义用户查询流程,否则沿用原有Azure AD授权:

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { UsersService } from '../users/users.service'; // 替换为你的UsersService实际路径

@Injectable()
export class AuthorizationGuard extends AuthGuard('azure-ad') {
  constructor(private readonly usersService: UsersService) {
    super();
  }

  async canActivate(context: ExecutionContext): Promise<boolean> {
    const request = context.switchToHttp().getRequest();
    const isBypass = request.headers['isbypass'];

    // 触发绕过逻辑
    if (isBypass) {
      // 示例:从请求头获取用户标识(可根据业务调整为参数/其他标识)
      const userId = request.headers['user-id'];
      if (!userId) return false;

      // 从数据库查询用户
      const targetUser = await this.usersService.findOne(userId);
      if (!targetUser) return false;

      // 赋值给req.user,后续接口可直接获取
      request.user = targetUser;
      return true;
    }

    // 未触发绕过,走原有Azure AD授权流程
    return super.canActivate(context) as Promise<boolean>;
  }
}

2. 确保UsersService可被注入

在AuthModule中导入UsersModule,保证守卫能拿到UsersService的实例:

// auth.module.ts
import { Module } from '@nestjs/common';
import { PassportModule } from '@nestjs/passport';
import { AzureADStrategy } from './azure-ad.strategy';
import { AuthorizationGuard } from './authorization.guard';
import { UsersModule } from '../users/users.module';

@Module({
  imports: [PassportModule, UsersModule],
  providers: [AzureADStrategy, AuthorizationGuard],
  exports: [AuthorizationGuard],
})
export class AuthModule {}

如果UsersService已通过@Global()装饰器设为全局模块,这一步可省略。

3. 生产环境安全提醒

  • 严格限制isbypass头的使用场景,比如仅允许测试环境、特定IP段触发
  • 避免直接用固定标识查询用户,建议结合签名验证等方式防止伪造请求

内容的提问来源于stack exchange,提问作者For fun programmer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 09:25:23