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
}
}