User is undefined on the context.switchToHttp().getRequest() nestjs
Asked Answered
T

1

5

I'm new to nestJs and I needed to add role based access to the application so I followed the documentation but in the execution context user doesn't exist. I can't seems to find the problem here's the github repo if you need to seem more code: https://github.com/anjula-sack/slinc-backend

roles.guard.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);
  }
}

app.controller.ts

  @UseGuards(JwtAuthGuard, RolesGuard)
  @Get('me/business')
  @Roles(Role.ADMIN)
  getBusiness(@Request() req) {
    return this.usersService.getUserBusiness(req.user.id);
  }
Tempo answered 9/5, 2021 at 3:9 Comment(4)
Do you have the RolesGuard bound globally by chance?Hypoxanthine
yeah it's in the app.module.tsTempo
Could you share the documentation you followed? Also, could you explain how you send the user in the request? Is it inside the header or the body? I tried the github URL you posted, but I guess it is a private repository so I can't seeWystand
can you check now? I made it public @ErangaHeshanTempo
C
7

From the code, I think you are mixing global and local guard

In app.module.ts, the below code is for registering global guard. and app.useGlobalGuard() should be used together if you want to apply guard globally.

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

But your intention should be building a local role guard, so please remove the above code and the request user will work.

Crinkle answered 9/5, 2021 at 5:14 Comment(2)
what if I want to use role guard as global? I don't wanna mention it in every controller.Heinous
I removed it from app.module.ts and placed in auth.module.ts. Now, It is working fine.Halda

© 2022 - 2024 — McMap. All rights reserved.