Springインテグレーションプロジェクト(基本認証を使用するSpringセキュリティAPIを使用)で、ユーザ名を読み取るためにプリンシパルオブジェクトにアクセスしようとしています。Springインテグレーションでプリンシパルユーザを抽出するHTTPインバウンドアダプタ
これは受信ゲートウェイの構造である:
<int-http:inbound-gateway request-channel="gatewayRequests"
\t \t reply-channel="gatewayResponses"
\t \t supported-methods="POST"
\t \t path="/api/v1/myservice"
\t \t request-payload-type="java.lang.String" reply-timeout="100">
\t \t <int-http:request-mapping consumes="application/xml" produces="application/xml"/>
\t \t <int-http:header name="principal" expression="T(org.springframework.security.core.context.SecurityContextHolder).context.authentication.principal"/>
\t </int-http:inbound-gateway>
私はこれでリプライから、前述の式ました:認証が成功にもかかわらず Spring Integration and http inbound adapter, how do I extract a principal user?
を、私は「ドンプリンシパルを参照してください - 式の結果がメッセージヘッダーにマップされることを期待していますが正しいですか?
ヘッダーへのマッピングの代わりに、次のコードを使用する場合、コードレイヤーのプリンシパル値にアクセスするにはどうすればよいですか(ペイロードに追加されたと仮定します)。
<payload-
expression="T(org.springframework.security.core.context.SecurityContextHolder).
context.authentication.principal">
誰もが親切に私を助けることができますか?よろしくお願いいたし
、
バーラト
"gatewayRequests"を聞いているServiceActivatorの中で、私は2つのアプローチを試しました:アプローチ1:Authentication authentication = SecurityContextHolder.getContext ).getAuthentication();文字列callerUserName = authentication.getName();アプローチ2:プリンシパルプリンシパル=(プリンシパル)incomingMessage.getHeaders()。get( "USER_PRINCIPAL");文字列callerUserName = principal.getName();これらの中で、アプローチ1は働いたがアプローチ2はそうしなかった。つまり、ユーザーは認証されましたが、なぜUSER_PRINCIPALに何も含まれていないのか分かりません。 – bmylavar
これは 'USER_PRINCIPAL'リテラルではありません。これは '.HttpHeaders.USER_PRINCIPAL'定数です。さて、あなたは間違いなくあなたがメッセージ内にあるすべてのヘッダーをチェックすることができます。たとえば、ログに記録してください。 –
パーフェクト!あなたのアドバイスで、私はすべてのヘッダーを記録し、値 "http_userPrincipal"が利用可能であり、これがHttpHeaders.USER_PRINCIPAL定数の値でもあることを確認しました。 – bmylavar