Xpath трансформацията не работи в java

Това е моят xml документ. Искам да подпиша само частта с потребителския идентификатор с помощта на xml подпис. Използвам xpath трансформация, за да избера този конкретен елемент.

<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
Version="2.0" IssueInstant="2012-05-22T13:40:52:390" ProtocolBinding="urn:oasis:na
mes:tc:SAML:2.0:bindings:HTTP-POST" AssertionConsumerServiceURL="localhos
t:8080/consumer.jsp">
<UserID>
   xyz
</UserID>
<testing>
   text
</testing>
<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
   http://localhost:8080/saml/SProvider.jsp
</saml:Issuer>
</samlp:AuthnRequest>


Използвам следния код, за да добавя трансформациите:

transformList.add(exc14nTransform);
 transformList.add(fac.newTransform(Transform.XPATH, new XPathFilterParameterSpec("samlp:AuthnRequest/UserID xmlns:samlp=\"urn:oasis:names:tc:SAML:2.0:protocol\"")));


Но получавам следното:

Original Exception was javax.xml.transform.TransformerException: Extra illegal t
okens: 'xmlns', ':', 'samlp', '=', '"urn:oasis:names:tc:SAML:2.0:protocol"'


И така, опитах да премахна частта xmlns.

transformList.add(fac.newTransform(Transform.XPATH, new XPathFilterParameterSpec("samlp:AuthnRequest/UserID")));


Но той подписва целия документ и дава следното съобщение:

com.sun.org.apache.xml.internal.security.utils.CachedXPa
thFuncHereAPI fixupFunctionTable
INFO: Registering Here function


Какъв е проблемът?
РЕДАКТИРАНЕ
Както каза @Jörn Horstmann, съобщението е просто лог или нещо подобно. Сега проблемът е, че дори след подаване на заявката за xpath целият документ се подписва вместо само UserID. Потвърдих това, като промених стойността на <testing>element след подписването на документа. Резултатът е, че документът не се валидира (ако е подписал само частта UserID, тогава всички промени, направени в <testing>, трябва да доведат до валиден подпис.)


person Ashwin    schedule 22.05.2012    source източник


Отговори (1)


Това не е валиден xpath израз, няма начин да се декларира префикс на пространство от имена вътре в израза.

samlp:AuthnRequest/UserID xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"

XPathFilterParameterSpec има друг конструктор, който позволява да се посочи съпоставяне на префикси на пространство от имена, можете да опитате следния израз:

new XPathFilterParameterSpec("samlp:AuthnRequest/UserID",
    Collections.singletonMap("samlp", "urn:oasis:names:tc:SAML:2.0:protocol"))

Редактиране:

Съобщението не изглежда да е грешка, вижте ред 426 тук, неговото лог ниво вероятно трябва да е по-ниско от INFO.

Разгледах и описанието на xpath филтрирането:

Изразът XPath, който се появява в параметъра XPath, се оценява веднъж за всеки възел във входния набор от възли. Резултатът се преобразува в булево. Ако булевото е вярно, тогава възелът е включен в изходния набор от възли. Ако булевото е невярно, тогава възелът е пропуснат от изходния набор от възли.

Така че правилният xpath израз, който включва само UserID в подписа, ще бъде self::UserID. Но не ме питайте дали това наистина има смисъл за xml подпис. Примерът в спецификацията изглежда използва израз xpath, за да включи всичко освен самия елемент на подписа:

not(ancestor-or-self::dsig:Signature)

Редактиране 2:

Правилният израз всъщност е ancestor-or-self::UserID, тъй като филтърът също трябва да включва текстовите дъщерни възли на възела UserID.

person Jörn Horstmann    schedule 22.05.2012
comment
Благодаря, че се отзовахте. Опитах го. Грешката за нелегален токен изчезна. Но сега, след като подписах документа, промених стойността на userID и след това се опитах да потвърдя този променен документ. Получава перфектно валидиране (не трябва да се случва). И все още получавам съобщението: com.sun.org.apache.xml.internal.security.utils.CachedXPa thFuncHereAPI fixupFunctionTable INFO: Функция за регистриране тук - person Ashwin; 22.05.2012
comment
Опитах samlp:AuthnRequest/self::UserID и samlp:AuthnRequest//self::UserID. Все пак подписва целия документ. - person Ashwin; 22.05.2012
comment
Можете ли също да опитате ancestor-or-self::UserID (без предхождащ AuthnRequest)? В противен случай би било полезно да публикувате пълния си код за подписване и проверка. - person Jörn Horstmann; 23.05.2012
comment
Благодаря много!! сега работи. какъв беше проблемът с предишните запитвания? - person Ashwin; 23.05.2012
comment
Изразът xpath се тества спрямо всеки възел в документа, вашият предишен израз би съвпаднал с възела, който има samlp:AuthnRequest като дъщерен, докато ancestor-or-self::UserID съвпада, ако текущият възел е UserID, а също и за всички негови текстови дъщерни възли. - person Jörn Horstmann; 23.05.2012
comment
Имам още един проблем. Искам да използвам xslt трансформация като последна трансформация. трансформацията xslt е ​​за целите на изобразяването. Как да добавя xslt трансформация след xpath трансформация в java? Искате ли да публикувам отделен въпрос за това? - person Ashwin; 23.05.2012
comment
Мисля, че това би било най-добре като отделен въпрос. - person Jörn Horstmann; 23.05.2012