NestJs授权中无法获取用户数据

问题描述 投票:0回答:1

我没有在 Roles.guard.ts const { user } = context.switchToHttp().getRequest(); 中获取此字符串中的 user 用户未定义,但是当我删除其他代码并仅保留此代码时:

canActivate(context: ExecutionContext): boolean {
    
    const { user } = context.switchToHttp().getRequest();
    colnsole.log(user)//user is exist
    return true
  }
}

和 console.log 我得到了用户,我不知道我应该做什么。我从文档中获取的代码。

代码: 角色.guard.ts

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Reflector } from '@nestjs/core';

@Injectable()
export class RolesGuard implements CanActivate {
  constructor(private reflector: Reflector) {}

  canActivate(context: ExecutionContext): boolean {
    const requiredRoles = this.reflector.getAllAndOverride<Role[]>(ROLES_KEY, [
      context.getHandler(),
      context.getClass(),
    ]);
    if (!requiredRoles) {
      return true;
    }
    const { user } = context.switchToHttp().getRequest();//user doesnt exist
    return requiredRoles.some((role) => user.roles?.includes(role));
  }
}

roles.enum.ts
export enum Role {
    User = 'User',
    Admin = 'Admin'
}

app.module.ts

@Module({
    imports: [
        ConfigModule.forRoot(),
        AuthModule,
        UserModule,
        ProductModule,
        ReviewModule,
        OrderModule,
        CategoryModule
    ],
    controllers: [AppController],
    providers: [
        AppService,
        PrismaService,
        {
            provide: APP_GUARD,
            useClass: RolesGuard
        }
    ]
})
export class AppModule {}
node.js nestjs backend nest
1个回答
0
投票

更有可能的是,您的

RolesGuard
,正如您在全局设置的那样,在您拥有的任何身份验证防护之前运行,因此将无法读取身份验证防护正在执行的任何操作。如果您计划保持 RolesGuard 全局,您可以而且可能应该将身份验证保护设置为全局,并向您想要跳过用户身份验证的路由添加一些元数据,以便它可以首先运行并让
RolesGuard
运行第二个
    

© www.soinside.com 2019 - 2024. All rights reserved.