Как установить Subject / NameID в CXF saml-callback-handler на основе значения из верблюжьего маршрута? - PullRequest
0 голосов
/ 17 июня 2019

Я реализую верблюжий маршрут в проекте весенней загрузки, который вызывает 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, но я бы установил его динамически, основываясь на значении имени пользователя из верблюжьего маршрута.Как мне этого добиться?

...