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

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

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

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

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

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

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

    if (!user) {
        return false;
    }

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

-ケビン

ベストアンサー1

結局のところ、これはガードに関する順序の問題のようで、フレームワークで順序を制御できない限り、簡単に解決できるものではないようです。

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

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

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

-ケビン

おすすめ記事