web-dev-qa-db-ja.com

NestJs-RolesGuardでユーザーコンテキストを取得できません

クライアントAPIのフレームワークとしてNestJSを使用しています。フレームワーク内では、正常に機能しているかなり標準的なPassport/JWT認証インフラストラクチャを使用しています。ベアラートークンが見つかるとAuthGuardが起動し、安全なAPIエンドポイントで、「@ Res()リクエスト」を介してHTTPコンテキストを挿入し、Jwtトークンのペイロードを含む「request.user」プロパティにアクセスできます。 。

これに加えて、ドキュメントおよびGitHubのサンプルプロジェクトの一部で提供されているサンプルコードと非常によく似た方法で「RolesGuard」を実装しようとしています(実際にはこのガードを使用していませんが、サンプルガードとして含まれています)。

私たちの問題は、AuthGuardがJwtトークンを起動して検証し、次にRolesGuardが起動するが、渡されるリクエストオブジェクトには、リクエストに添付されたユーザーメタデータがないことです。

RolesGuardのキーコードは次のとおりです。

    const request = context.switchToHttp().getRequest();
    const user = request.user;

    if (!user) {
        return false;
    }

上記の切り取りでは、ユーザーは常に偽です。現在のユーザーのスコープに正常にアクセスできる役割/権限ベースのガードをNestに作成した人はいますか?すべてのコードが実行され、すべてが正しく登録されているように見えます。

-ケビン

8

最終的に、これは警備員の順序の問題であるように見え、簡単に解決できるようには見えません(フレームワークが順序をある程度制御できない場合)。

私の望みは、RolesGuardをグローバルに登録することでしたが、それにより、最初に登録され、最初に起動されます。

@UseGuards(AuthGuard('jwt'), RolesGuard)
@Roles('admin')

エンドポイントレベルで登録し、AuthGuardの後に配置すると、2番目に起動し、ガード自体の中で期待しているユーザーコンテキストを取得します。完璧ではありませんが、機能します。

-ケビン

12

roleGuardをエンドポイントレベルで登録し、AuthGuardの後に配置すると、2番目に起動し、ガード自体の中で期待するユーザーコンテキストを取得します。モジュールでRoleGuardを登録しないでください。最初に登録され、最初に起動されます。

* .module.ts

imports: [],
  providers: [{provide: APP_GUARD, useClass: RolesGuard} ,],  // remove guard
  controllers: [],
  exports: [],
1
Mohamed Bayomi