この質問は、Spring Security Oauth2ライブラリでやっている作業の結果です。 oauth2認証サーバーとoauth2リソースサーバーを設定しました。後者はアクセストークンに基づいて認証することを目的としています。Spring Security:リクエスト本体を2回デシリアライズする(oauth2処理)
通常のアクセストークンはヘッダーに渡されますが、これを設定している大きなクライアントは、アクセストークンをJSON要求本体に渡したいとします。そこには、カスタムアクセストークン抽出を設定するために使用できるインターフェイスですが、それは次のようになります。だから、
public interface TokenExtractor {
/**
* Extract a token value from an incoming request without authentication.
*
* @param request the current ServletRequest
* @return an authentication token whose principal is an access token (or null if there is none)
*/
Authentication extract(HttpServletRequest request);
}
、私が言うことができる最善のように、生てHTTPServletRequestがあるために、すべての私は、そこから私がする必要がある、アクセス権を持っています要求を逆シリアル化してアクセストークンを抽出します。さらに物事を複雑に
は、しかし、リクエストボディはまた、処理に必要な他のパラメータが含まれているという事実であるので、私は、私は私のコントローラに渡すDTOクラスにそのようなものを、それをデシリアライズしたい:
@RequestMapping("/oauth/someresource")
@Transactional
public Map<String, String> resource(@AuthenticationPrincipal UserDetails userDetails,
@RequestBody ClientRequestDto clientRequestDto) {
// Do some processing based on the request dto
}
トークン・エクストラクタでリクエストをデシリアライズしようとしましたが、「java.lang.IllegalStateException:getReader()がすでにこのリクエストに対して呼び出されました」というエラーが発生します。トークンの抽出にオブジェクトをデシリアライズ入力ストリーム
- :私は研究ができ、そしてこれまでのところ、私が作ってみたいくつかの可能な解決策をブレーンストーミングた
@RequestBody
- のように2の代わりに、私のコントローラ内の生のリクエストオブジェクトにアクセスするだけですが、生の要求に接続されたオブジェクトをフェッチするカスタムデシリアライザを追加する方法がありますリクエストの入力ストリームを処理します。
とにかく、これはちょっとした考えです。誰かがこれを解決する優雅な方法について考えているなら、私は大いに感謝します。
編集:私は似ているこの質問を見つけました:Spring reading request body twice、そして最後の答えは可能な解決策を持っています(複数の入力ストリームの読み込みを許可し、フィルターチェーンを早くに作成するデコレータ要求クラスを作成しますHttpServletRequest)を呼び出します。それは実行可能だが、少し重い義務だ、私は誰も他のアイデアを持っているかどうかを確認するためにこれを残します。