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
相关产品推荐
相关产品推荐

