javascript 上下文中未定义用户,switchToHttp().getRequest()nestjs

fzsnzjdm  于 2023-01-19  发布在  Java
关注(0)|答案(1)|浏览(142)

我是nestJs的新手,我需要添加基于角色的应用程序访问,所以我按照文档,但在执行上下文中用户不存在.我似乎找不到问题,如果你需要更多的代码,这里是github repo:https://github.com/anjula-sack/slinc-backend

角色.防护.ts

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { ROLES_KEY } from 'src/decorators/roles.decorator';
import Role from 'src/util/enums/role.enum';

@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();
    console.log(context.switchToHttp().getRequest().req);

    return requiredRoles.some((role) => user.type === role);
  }
}

应用程序控制器.ts

@UseGuards(JwtAuthGuard, RolesGuard)
  @Get('me/business')
  @Roles(Role.ADMIN)
  getBusiness(@Request() req) {
    return this.usersService.getUserBusiness(req.user.id);
  }
siv3szwd

siv3szwd1#

从代码来看,我认为您混合了全局和本地保护
app.module.ts中,以下代码用于注册全局保护。如果要全局应用保护,则应同时使用和app.useGlobalGuard()

// Remove the following code in app.module.ts
{
    provide: APP_GUARD,
    useClass: RolesGuard,
}

但您的意图应该是构建一个本地角色保护,因此请删除上面的代码,请求用户将工作。

相关问题