【问题标题】:nestjs return undefined in Public GuardsNestjs 在公共警卫中返回未定义
【发布时间】:2022-05-13 03:58:41
【问题描述】:

我点击这个链接https://docs.nestjs.com/security/authentication#enable-authentication-globally

我继续创建了一个公共警卫

但是当我将@Public 放在任何方法之上时,它无法识别我的请求

并返回未定义的!

我想检测用户是否登录公共路由

JwtAuthGuard

export class JwtAuthGuard extends AuthGuard('jwt') {
  constructor(private reflector: Reflector) {
    super();
  }

  canActivate(context: ExecutionContext) {
    const isPublic = this.reflector.getAllAndOverride<boolean>(IS_PUBLIC_KEY, [
      context.getHandler(),
      context.getClass(),
    ]);
    if (isPublic) {
      return true;
    }
    return super.canActivate(context);
  }
}

公共装饰师

export const IS_PUBLIC_KEY = 'isPublic';
export const Public = () => SetMetadata(IS_PUBLIC_KEY, true);

样品控制器

@Public()
@Get()
async find(@LoginUser() user: User): Promise<any> {
    console.log(user);
    // the user is undefined even after login
}

【问题讨论】:

  • 什么返回underfined?你能显示代码吗?这个公卫是做什么的?
  • 这个守卫的任务是在没有 @Public Decorater 的情况下检查 jwt 令牌的存在,但是当我把它放在任何方法之上时,它无法识别用户
  • @JayMcDoniel 我编辑了问题并添加了一些代码

标签: node.js authorization nestjs guard


【解决方案1】:

您将路由设置为公开,并在您的守卫中有一个子句“如果路由是公开的,则在尝试登录之前返回 true”。如果您想登录,无论路由是否公开,并且 然后 始终返回 ture,您可以执行类似的操作

export class JwtAuthGuard extends AuthGuard('jwt') {
  constructor(private reflector: Reflector) {
    super();
  }

  canActivate(context: ExecutionContext) {
    const canAct = await (super.canActivate(context) as Promise<boolean>)
    const isPublic = this.reflector.getAllAndOverride<boolean>(IS_PUBLIC_KEY, [
      context.getHandler(),
      context.getClass(),
    ]);
    return isPublic ?? canAct;
  }
}

这将让护照从一开始就尝试登录。只要您没有在valdiate 方法或validate 方法调用的任何内容中抛出错误,一切都应该像Passport 那样进行登录,检查路由是否公开,如果是则返回true,如果如果路由不公开,则登录成功。

【讨论】:

    【解决方案2】:

    写这个:

    constructor(@Inject(Reflector) private reflector: Reflector){
        super();
    }
    

    【讨论】:

      猜你喜欢
      • 2021-03-09
      • 2018-10-28
      • 2020-02-18
      • 2020-06-30
      • 1970-01-01
      • 2021-12-14
      • 2020-12-14
      • 2019-08-07
      • 1970-01-01
      相关资源
      最近更新 更多