微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我们如何从 NestJS 中的服务类访问装饰器

如何解决我们如何从 NestJS 中的服务类访问装饰器

我是 nestJS 的新手,正在尝试进行身份验证系统。我能够做到。所以这就是我为了访问身份验证所做的事情。

在我的控制器中我有

@Get('/user')
async getUser(@AuthUser() token: string) : Promise<Object> {
    return this.authService.getUser(token)
    return token
}

这里我传递了一个 AuthUser 装饰器,我想避免传入控制器。 在 authService.getUser 方法中,我有这样的事情

async getUser(token: string): Promise<Object> {
    try {
        const user = await this.jwtService.verifyAsync(token)
        return user 
    } catch (error) {
        return false
    }
}

我的装饰器看起来像这样

import { createParamDecorator,ExecutionContext } from '@nestjs/common';

export const AuthUser = createParamDecorator(
(data = 'u_ses',ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();
    return data ? request.cookies?.[data] : request.cookies;
},);

我不喜欢代码。如果我需要从服务类或任何地方知道用户 ID,我需要传递令牌并获取令牌,我需要使用 @AuthUser() token: string)

所以我想做这样的事情

this.authService.getUser()在这里我不想传递令牌或任何东西,应该能够从任何地方访问这个 getUser 方法。由于它是一个服务类,我可以注入和使用它,但我没有令牌。

我尝试在服务类中注入装饰器,但这不起作用。

我更喜欢的一个最好的解决方案是在装饰器中使用 JWT 的东西,所以我不需要服务类的方法:)

我正在向您寻求更好的解决方案 :)

谢谢。

解决方法

Nestjs 有 NestMiddleware。在这里,您可以像这样在访问控制器之前进行授权:

import { Injectable,NestMiddleware,UnauthorizedException } from '@nestjs/common';
import { Request,Response,NextFunction } from 'express';

@Injectable()
export class AuthenticationMiddleware implements NestMiddleware {
  use(req: Request,res: Response,next: NextFunction) {
    const headerAuthentication = req.headers.authorization;
    if(!headerAuthentication) throw new UnauthorizedException('Authorization failed!');
    const token = req.headers.authorization.split(' ')[1];
    if(token) {
      next();
    }else {
      throw new UnauthorizedException('Authorization failed!');
    }
  }
}

并在 AppModule 中实现它

  configure(consumer: MiddlewareConsumer) {
    consumer.apply(AuthenticationMiddleware).forRoutes('/');
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?