簡體   English   中英

CXF Web服務服務器委托向內部Web服務調用的請求憑據

[英]CXF Webservice Server delegate Request Credentials to inner Webservice Call

如何將憑證(基本身份驗證)從獲取請求傳遞到另一個Web服務的新請求?

我沒有找到任何可以在單個請求中在攔截器之間共享數據的屬性包。

為了澄清:

  • 客戶端[具有基本身份驗證憑據]->請求-> WS-1
  • ** WS-1->請求-> WS-2,並通過原始客戶端的憑據傳遞
  • ** WS-1->請求-> WS-3(無信用)
  • WS-1->響應->客戶端

希望有了這個解決方案,我不會在幾秒鍾內運行。 有麻煩嗎?

我做了什么:

添加一個inInterceptor讀取的憑據和遠程IP

    AuthorizationPolicy policy = message.get(AuthorizationPolicy.class);

    if (policy == null) {
        sendErrorResponse(message, HttpURLConnection.HTTP_UNAUTHORIZED);
        return;
    }


    message.put("request_usr", policy.getUserName());
    message.put("request_pwd", policy.getPassword());

操縱CXF生成的WebServiceClient來更改構造函數的返回值,例如

/**
 * 
 * @return returns WebServiceClass
 */
@WebEndpoint(name = "WebServiceClassSoap")
public WebServiceClassSoap getWebServiceClassSoap() {
    return dynamicAuthorisation(super.getPort(WebServiceClassSoap,
            WebServiceClassSoap.class));
} 

private WebServiceClassSoap  dynamicAuthorisation (WebServiceClassSoap  service) {
    return dynamicAuthorisation(service, 
                PhaseInterceptorChain.getCurrentMessage().get("request_usr").toString(),
                PhaseInterceptorChain.getCurrentMessage().get("request_pwd").toString());
}


private WebServiceClassSoap  dynamicAuthorisation (WebServiceClassSoap  service, String username, String password) {

    Client client = ClientProxy.getClient(service);
    HTTPConduit http = (HTTPConduit) client.getConduit();

    AuthorizationPolicy auth = http.getAuthorization();

    auth.setUserName(username);
    auth.setPassword(password);

    http.setAuthorization(auth);

    return service;
}

將http-conf:conduit留在beans.xml中

    <http-conf:conduit name="{http://schemas.foobar.com/websvc/WebServiceClass/}WebServiceClassSoap.http-conduit">
        <http-conf:authorization>
                <!-- 
                <sec:UserName>${webservices.username}@${webservices.domain}</sec:UserName>
                <sec:Password>${webservices.password}</sec:Password>
                -->
                <sec:AuthorizationType>Basic</sec:AuthorizationType>
        </http-conf:authorization>
        <http-conf:client AllowChunking="false" ConnectionTimeout="30000" />            
</http-conf:conduit>

感謝Apache CXF:將信息從攔截器轉發到實際的Web服務實現 =)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM