Я реализую верблюжий маршрут в проекте весенней загрузки, который вызывает Web-сервис через компонент camel-cxf.Веб-служба ожидает токен SAML2.0, и мне нужно установить Subject / NameID динамически на основе входных данных, предоставленных для верблюжьего маршрута (на данный момент, только параметр шаблона REST, позже токен JWT).
Я реализовал свой собственный обработчик обратного вызова cxf, чтобы установить издателя и тему.Тем не менее, я не нашел никаких средств для доступа к данным (то есть имени пользователя) из верблюжьего обмена из обработчика обратного вызова.
Вот мой верблюжий контекст, который получает имя пользователя в качестве переменной заголовка радипримера.Обратите внимание, что конечная точка cxf ссылается на ws-security-policy для saml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
<camelContext id="camel"
xmlns="http://camel.apache.org/schema/spring">
<rest id="rest-0829aac2-273b-41c3-846f-cb9b2324f084">
<get id="4b0a7db2-f775-4c72-a3ed-9e67c3d79961"
uri="/login/{username}">
<to uri="direct:simple-route" />
</get>
</rest>
<route id="simple-route">
<!-- prepare request - omitted -->
<to id="invoke-ws"
uri="cxf:bean:myServiceEndpoint?defaultOperationName=myOperation" />
</route>
</camelContext>
<cxf:cxfEndpoint
address="http://localhost/someServer"
id="myServiceEndpoint"
serviceClass="org.mycompany.MyServicePortType">
<cxf:properties>
<entry key="security.saml-callback-handler">
<ref bean="samlCallbackBean" />
</entry>
<entry key="security.signature.properties"
value="security.properties" />
</cxf:properties>
<cxf:features>
<p:policies>
<wsp:PolicyReference
URI="classpath:saml-policy.xml" />
</p:policies>
</cxf:features>
</cxf:cxfEndpoint>
</beans>
И это мой обработчик обратного вызова, который устанавливает издателя и тему:
@Component("samlCallbackBean")
public class MySAMLCallback implements CallbackHandler, Callback {
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
if (callbacks[i] instanceof SAMLCallback) {
SAMLCallback callback = (SAMLCallback) callbacks[i];
callback.setIssuer("myissuer");
// Where do I get the user from?
String user = ...;
SubjectBean subjectBean = new SubjectBean(user, "", SAML2Constants.CONF_SENDER_VOUCHES);
callback.setSubject(subjectBean);
}
}
}
}
В настоящее время пользователь является просто константным литералом String, но я бы установил его динамически, основываясь на значении имени пользователя из верблюжьего маршрута.Как мне этого добиться?