0

XACML アプローチを使用して Java Web サービスを実装しようとしています。

String を返す 1 つのメソッドと、Web サービスへのすべての要求をフィルタリングする PEP を含む 2 つの非常に単純な Web サービスを実装しました。すべてのクライアント (RPCServiceClient) は、Web サービスを呼び出すときに SOAP ヘッダー (addHeader メソッド) を介して必要な情報を渡す必要があります。デフォルトでは、RPCServiceClient サービス呼び出しの SOAP ヘッダーは空です。PEP がリクエストをインターセプトした後、これらの情報を抽出し、認証メソッドのパラメーターとして渡します。問題は、PEP が SOAP ヘッダーを読み取ろうとするときに、常に次の例外が発生することです。

org.apache.axis2.AxisFault: com.ctc.wstx.exc.WstxEOFException: Unexpected EOF in prolog
    at [row,col {unknown-source}]: [1,0] 
    at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
    at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:123)
    at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:67)
    at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:354)
    at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:421)
    at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229)
....

SOAP メッセージが整形式かどうかは既に確認しましたが、それでも同じ問題があります。

誰か助けてください??

編集:

Client から送信される SOAP リクエストを次に示します。

<?xml version='1.0' encoding='UTF-8'?>
 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header>
    <ns1:RequestSOAPHeader xmlns:ns1="http://ws.transaccess.com">
     <ns1:username>bob</ns1:username>
     <ns1:action>read</ns1:action>
     <ns1:resourceId>file1</ns1:resourceId>
    </ns1:RequestSOAPHeader>
   </soapenv:Header>
   <soapenv:Body>
    <getRead xmlns="http://ws.transaccess.com">
     <arg0 xmlns="">bob</arg0>
    </getRead>
   </soapenv:Body>
 </soapenv:Envelope>

更新: これは私の PEP です:

public class WebPEP implements Filter{

public void doFilter(ServletRequest req, ServletResponse res,
        FilterChain chain) throws IOException, ServletException {

    if (req instanceof HttpServletRequest && res instanceof HttpServletResponse) {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        // PEP filter 
            RequestWrapper copiedRequest = new RequestWrapper(request);
            try{
                BufferedReader bReader = copiedRequest.getReader(); 
                String soapText=bReader.readLine(); 

                // Create SoapMessage  
                MessageFactory msgFactory     = MessageFactory.newInstance();  
                SOAPMessage message           = msgFactory.createMessage();  
                SOAPPart soapPart             = message.getSOAPPart();  

                // Load the SOAP text into a stream source  
                byte[] buffer                 = soapText.getBytes();  
                ByteArrayInputStream stream   = new ByteArrayInputStream(buffer);  
                StreamSource source           = new StreamSource(stream);  

                // Set contents of message   
                soapPart.setContent(source);

                //Try accessing the SOAPBody  

                SOAPHeader soapHeader = message.getSOAPHeader();
                NodeList param =  soapHeader.getElementsByTagNameNS("http://ws.transaccess.com", "RequestSOAPHeader");

                if(param.getLength()>0){
                    Element accessInfo = (Element) param.item(0);
                    NodeList user = accessInfo.getElementsByTagNameNS("http://ws.transaccess.com", "username");
                    targetUser = user.item(0).getTextContent();
                    NodeList action = accessInfo.getElementsByTagNameNS("http://ws.transaccess.com", "action");
                    targetAction = action.item(0).getTextContent();
                    NodeList resource = accessInfo.getElementsByTagNameNS("http://ws.transaccess.com", "resourceId");
                    targetResource = resource.item(0).getTextContent();
                }  

            } catch (SOAPException e1) {

                e1.printStackTrace();
            } 
            try {

                if(isUserAuthorize(targetResource, targetUser, targetAction)){
                    System.out.println("\nUser is authorized to perform this action\n\n");
                } else {
                    System.out.println("\nUser is NOT authorized to perform this action\n\n");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            chain.doFilter(req, res);
        }
        else{
            chain.doFilter(req, res);
        }
}
@Override
public void destroy() {
    // TODO Auto-generated method stub
}

@Override
public void init(FilterConfig arg0) throws ServletException {
    // TODO Auto-generated method stub
}

}
4

3 に答える 3

0

問題は解決しました。この問題の原因は、間違った (HttpServletRequest) リクエストを転送したことです。私は転送する必要があります

chain.doFilter(copiedRequest, res);

それ以外の

chain.doFilter(req, res);

私はcopyedRequestに取り組んでいるので

コメントしてくれてありがとう

于 2014-01-21T09:52:31.473 に答える
-1

エラーから理解できることは、 Whwn PEP が soap ヘッダーからのパラメーターを使用して認証しようとしています。ヘッダーに間違ったユーザー名とパスワードを指定しているか、Web サービスの実装で SOAP メッセージを返していません。

ありがとう、アンブジ

于 2013-12-16T07:01:26.090 に答える