我们如何从 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('/');
  }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...