1
:私はSoapHandlerを作成へのアクセスを確保JAX-WS EJB私はEJBによって実装このセキュアソープWebサービスにアクセスするにはどうすればよいのWebサービス
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>ApplicationRealm</realm-name>
</login-config>
:
@Stateless
@DeclareRoles({"Boss"})
@WebService(name="SoapService", serviceName="SoapWS", portName="SoapWSPort")
public class SoapServiceImpl implements SoapService {
@RolesAllowed({"Boss"})
public SoapThing getSoapThing(String name, String prepend) throws SoapThingyException {
...
}
}
とweb.xmlはこの持ちクライアントは次のようにAuthorizationヘッダーを要求に追加します。
public boolean handleMessage(SOAPMessageContext context) {
try {
String credential = Base64.getEncoder().encodeToString((username+":"+password).getBytes("UTF-8"));
Map<String, Object> httpHeaders = null;
if (context.get(MessageContext.HTTP_REQUEST_HEADERS) != null) {
httpHeaders = (Map<String, Object>)context.get(MessageContext.HTTP_REQUEST_HEADERS);
} else {
httpHeaders = new HashMap<>();
}
httpHeaders.put("Authorization", Arrays.asList("Basic " + credential.substring(0, credential.length()-1)));
context.put(MessageContext.HTTP_REQUEST_HEADERS, httpHeaders);
return true;
} catch (UnsupportedEncodingException e) {
return false;
}
}
クライアントはスタンドアロンのJavaアプリケーションでスタブを使用していますwsimportので生成され、そしてBindingProviderにハンドラを追加します。
SoapWS service = new SoapWS();
SoapService port = service.getSoapWSPort();
((BindingProvider)port).getBinding().setHandlerChain(Arrays.asList(new CredentialHandler("spike", "*****")));
SoapThing st = port.getSoapThingByNumber(1);
...それはAuthorizationヘッダに認証情報を追加し、罰金実行しますが、私はまだサーバーから不正な応答を取得しています:
Exception in thread "main" com.sun.xml.internal.ws.client.ClientTransportException: The server sent HTTP status code 401: Unauthorized
WebServiceがWildfly上に配備され、ユーザがApplicationRealm、ロールAdministatorに割り当てられ、グループ犬とボス:
私は何が欠けていますか? JAX-WSクライアントで基本認証を使用して
それはトリック、ありがとう。私はハンドラがこのコードを置くのに適していると思っていましたが、OKです。 –
基本認証であるため、サーバーはメッセージペイロードをまったく見ません。 –