クライアント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に作成した人はいますか?すべてのコードが実行され、すべてが正しく登録されているように見えます。
-ケビン
最終的に、これは警備員の順序の問題であるように見え、簡単に解決できるようには見えません(フレームワークが順序をある程度制御できない場合)。
私の望みは、RolesGuardをグローバルに登録することでしたが、それにより、最初に登録され、最初に起動されます。
@UseGuards(AuthGuard('jwt'), RolesGuard)
@Roles('admin')
エンドポイントレベルで登録し、AuthGuardの後に配置すると、2番目に起動し、ガード自体の中で期待しているユーザーコンテキストを取得します。完璧ではありませんが、機能します。
-ケビン
roleGuardをエンドポイントレベルで登録し、AuthGuardの後に配置すると、2番目に起動し、ガード自体の中で期待するユーザーコンテキストを取得します。モジュールでRoleGuardを登録しないでください。最初に登録され、最初に起動されます。
* .module.ts
imports: [],
providers: [{provide: APP_GUARD, useClass: RolesGuard} ,], // remove guard
controllers: [],
exports: [],