context.switchToHttp().getRequest() nestjs 上未定义用户
User is undefined on the context.switchToHttp().getRequest() nestjs
我是 nestJs 的新手,我需要添加对应用程序的基于角色的访问,所以我遵循了文档,但在执行上下文中用户不存在。如果您需要更多代码,我似乎无法在 github 存储库中找到问题: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);
}
从代码来看,我认为你混合了全局和本地守卫
在app.module.ts
中,以下代码用于注册全局守卫。
和 app.useGlobalGuard()
如果你想全局应用保护,应该一起使用。
// Remove the following code in app.module.ts
{
provide: APP_GUARD,
useClass: RolesGuard,
}
但您的意图应该是构建一个本地角色守卫,所以请删除上面的代码,请求用户将起作用。
我是 nestJs 的新手,我需要添加对应用程序的基于角色的访问,所以我遵循了文档,但在执行上下文中用户不存在。如果您需要更多代码,我似乎无法在 github 存储库中找到问题: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);
}
从代码来看,我认为你混合了全局和本地守卫
在app.module.ts
中,以下代码用于注册全局守卫。
和 app.useGlobalGuard()
如果你想全局应用保护,应该一起使用。
// Remove the following code in app.module.ts
{
provide: APP_GUARD,
useClass: RolesGuard,
}
但您的意图应该是构建一个本地角色守卫,所以请删除上面的代码,请求用户将起作用。