基本的に問題は次のとおりです。
ユーザー名を引数として取り、それに応じて XML データを生成するストアド データベース プロシージャがあります。セキュリティで保護されていない Web サービス (Web サービス WSA と呼びましょう) で、引数のないメソッドによって呼び出されます。WSA を呼び出すことになっている別の Web サービス (WSB と呼びましょう) もあります。この設定では、WSA は WSB によってのみ呼び出され、他のユーザーによって呼び出されることはありません。WSB はユーザーが呼び出すものであり、必要な XML データを取得する方法です。Web サービスは OC4J にデプロイされ、セキュリティが有効になっています。WSB は OC4J によって保護されており、OC4J ユーザーのユーザー名とパスワードを入力することでアクセスできます。
Web サービスをテストする場合、OC4J は、Web サービスを呼び出す前にログイン情報を入力できるフォームを提供します。ヘッダーにセキュリティ情報を含めることを選択し、サービスを呼び出す前にメッセージをプレビューすると、ユーザー名とパスワードがメッセージに含まれます。
私の問題は、エンドポイントの実装とストアド プロシージャの呼び出しに到達するためのセキュリティ情報 (または少なくともユーザー名) を取得できないことです。ここまでで、WSA を作成し、それを参照する Web サービス プロキシを作成し、そのプロキシを基に WSB を作成しました。
ユーザー名を取得するためにこれまでに試したこと(およびそれが機能しない理由):
WSA に実装してもらいました
javax.xml.rpc.server.ServiceLifecycle
。これにより、WSA に のインスタンスがjavax.xml.rpc.server.ServletEndpointContext
提供され、java.security.Principal
. ただし、それPrincipal
はnull
WSB を呼び出した場合です (これが WSA を呼び出します)。WSA を保護して直接呼び出すと、Pricipal
は null ではなく、ユーザーが含まれます (ただし、WSA ではなく WSB を呼び出す必要があるため、問題は解決しません)。javax.xml.rpc.handler.GenericHandler
メッセージを処理できるはずの両方のサービスのハンドラー (拡張) を作成しました。ここで私を本当に困惑させたことが1つあります。ハンドラー メソッドが正しく呼び出されます。WSB ハンドラーが要求を処理し、次に WSA ハンドラーが要求を処理し、次に WSA ハンドラーが応答を処理し、最後に WSB ハンドラーが応答を処理します。しかし、各ステップでメッセージをファイルに出力しようとすると、最初のステップ (WSB が要求を処理するとき) でさえ、メッセージにセキュリティ情報がないことがわかりました。ユーザー名も何もありません。このメッセージは、実際には、サービスを呼び出す前に要求メッセージをプレビューしたときに呼び出しページに表示されるものとはかなり異なります。WebServiceContext
アノテーションを使用してのインスタンスを注入しようとしまし@Resource
たが、明らかに OC4J はこれをサポートしていません。
私が何か間違ったことをしている可能性がある場所に誰かが光を当てることができれば、私はとても感謝しています.