2017-08-22 12 views
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に割り当てられ、グループ犬とボス:

enter image description here

私は何が欠けていますか? JAX-WSクライアントで基本認証を使用して

答えて

1

はそれよりも簡単です:

SoapWS service = new SoapWS();  
SoapService port = service.getSoapWSPort(); 
Map<String,Object> requestContext = ((BindingProvider)port).getRequestContext(); 
requestContext.put(BindingProvider.USERNAME_PROPERTY, username); 
requestContext.put(BindingProvider.PASSWORD_PROPERTY, password); 

SoapThing st = port.getSoapThingByNumber(1); 

ませハンドラは必要ありません。

JAX-WSクライアントマシンはHTTP 401チャレンジを自動的に処理します。

+0

それはトリック、ありがとう。私はハンドラがこのコードを置くのに適していると思っていましたが、OKです。 –

+0

基本認証であるため、サーバーはメッセージペイロードをまったく見ません。 –

関連する問題