0

WSS4Jを使用して、クライアントからのWebサービス呼び出しにパスワードダイジェストWS-Securityビットを追加しようとしています。AxisのWSDL4Jを使用してWSDLからクライアントクラスを生成し、WSS4Jを使用してWS-Securityの「パスワードダイジェスト」ヘッダーをSOAPメッセージに追加する手順に従いましたが、「ヘッダーの処理中にエラーが検出されました」というエラーメッセージが返されます。デバッグメッセージを追加すると、CallbackHandlerがヒットしているようには見えません。私は何か非常に間違ったことをしていますか?または、WSS4Jのドキュメントで説明されていないセットアップ部分が欠落していますか?

class CSProvider {
    public CS get(CSService csService, URL url, String username)
            throws ServiceException {
        CS csPort = csService.getCSPort(url);

        ((Stub) csPort)._setProperty(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
        ((Stub) csPort)._setProperty(WSHandlerConstants.USER, username);
        ((Stub) csPort)._setProperty(UsernameToken.PASSWORD_TYPE, WSConstants.PW_DIGEST);
        ((Stub) csPort)._setProperty(WSHandlerConstants.PW_CALLBACK_CLASS, "com.example.namespace.to.PasswordCallbackHandler");

        return csPort;   
    }
}

public class PasswordCallbackHandler implements CallbackHandler {

    @Override
    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
        for (Callback callback : callbacks) {
            if (callback instanceof WSPasswordCallback) {
                ((WSPasswordCallback) callback).setPassword(PasswordStore.getPassword());
            } else {
                throw new UnsupportedCallbackException(callback);
            }
        }
    }
}
4

1 に答える 1

1

多くのことを突っついた後、私は問題を発見しました。予想どおり、Web サービス リクエストは を通過せずにPasswordCallbackHandler送信されたため、有効な認証資格情報を期待していたリモート サーバーから所定のエラー メッセージが返されました。csService次のようにサービス ロケータ (この場合は )を作成する必要があることを判断するのに少し時間がかかりました。

CSService csService = new CSServiceLocator(new FileProvider("client_deploy.wsdd"));

次のような client_deploy.wsdd ファイルを使用します。

<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
    <transport name="http" pivot="java:org.apache.axis.transport.http.HTTPSender"/>
    <globalConfiguration>
        <requestFlow>
            <handler name="csHandler" type="java:org.apache.ws.axis.security.WSDoAllSender"/>
        </requestFlow>
    </globalConfiguration>
</deployment>

次に、からのプロパティの設定がCSProvider.get()うまくいきました。

私が見た他のすべての例では、ユーザー名とパスワードのクラスを設定するために wsdd ファイルを使用していたため、wsdd ファイルを避けていました。この 2 つのことは実行時までわかりません。賢明な言葉: wsdd ファイルの代わりに_setProperty()メソッドを使用できるとドキュメントに記載されている場合、それはファイルを完全に置き換えるのではなく、それらのプロパティを設定する目的でのみ意味します。

于 2012-04-19T20:31:44.947 に答える