首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将我的服务层注入8月警卫?NestJS - AuthGuards

如何将我的服务层注入8月警卫?NestJS - AuthGuards
EN

Stack Overflow用户
提问于 2022-11-08 01:32:02
回答 1查看 22关注 0票数 0

我正在通过UseGuards创建一个身份验证系统,但是如何将依赖项注入到我的警卫中呢?我想以一种全局的方式来做,以避免重复代码和每个控制器导入注入。

我使用依赖反转和注入类的模式,我也使类只依赖于实现和接口规则.

我的AuthServices

代码语言:javascript
复制
export class AuthServices implements IMiddlewareAuth {
  constructor(
    private readonly jwt: IJWTDecrypt,
    private readonly authUserRepo: IAuthUserContract,
  ) {}

  public async intercept(
    req: IMiddlewareAuth.Attrs,
  ): Promise<IMiddlewareAuth.Return> {
    const token = req.headers['Authorization'];

    if (!token) {
      new Fails('Access denied', 403);
    }

    const parts = token.split(' ');
    if (parts.length !== 2) {
      return new Fails('Anauthorized', 401);
    }

    const [scheme, access] = parts;
    if (!/^Bearer$/i.test(scheme)) {
      return new Fails('Anauthorized', 400);
    }

    const id = await this.jwt.decrypt(access);
    if (!id) {
      return new Fails('Anauthorized', 400);
    }

    const user = await this.authUserRepo.findById(id);
    if (!user) {
      return new Fails('Anauthorized', 400);
    }

    return user;
  }
}

我的Auth.Guards

代码语言:javascript
复制
@Injectable()
export class AuthorizationGuard implements CanActivate {
  constructor(
    @Inject('AuthServices')
    private authServices: IMiddlewareAuth,
  ) {}

  public async canActivate(context: ExecutionContext): Promise<boolean> {
    const request = context.switchToHttp().getRequest();

    const user = await this.authServices.intercept(request);
    if (user instanceof Fails) {
      throw new HttpException(
        {
          statusCode: user.statusCode,
          error: user.message,
        },
        user.statusCode,
      );
    }

    request.user = {
      email: user.email,
      id: user.id,
      name: user.name,
    } as ISessionLogin;

    return true;
  }
}

我的Auth.Module

代码语言:javascript
复制
@Module({
  imports: [ConfigModule.forRoot(), TypeOrmModule.forFeature([UserEntity])],
  providers: [
    {
      provide: AuthUserRepository,
      useFactory: (dataSource: DataSource) => {
        return new AuthUserRepository(
          dataSource.getMongoRepository(UserEntity),
        );
      },
      inject: [getDataSourceToken()],
    },
    {
      provide: JsonWebToken,
      useFactory: () => {
        return new JsonWebToken();
      },
    },
    {
      provide: AuthServices,
      useFactory: (
        jwt: JsonWebToken,
        authUserRepository: AuthUserRepository,
      ) => {
        return new AuthServices(jwt, authUserRepository);
      },
      inject: [JsonWebToken, AuthUserRepository],
    },
  ],
  exports: [AuthServices],
})
export class AuthModule {}

错误

EN

回答 1

Stack Overflow用户

发布于 2022-11-08 01:34:16

使用@Inject(AuthService)而不是@Inject('AuthService')。重要的区别是'AuthService'是与AuthService.name匹配的字符串令牌,AuthService是类引用。另外,确保CreateUsersModule在其imports数组中有AuthModule

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74354765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档