Установка заголовка запроса на сервере до аутентификации в Keycloak

Я использую аутентификацию на основе заголовка keycloak для защиты REST API. Там я хочу установить поле заголовка запроса (в основном заголовок аутентификации keycloak) до того, как произойдет аутентификация.

Другой подход к этому объяснен здесь: Как получить javax .servlet.Filter, вызываемый перед аутентификацией Keycloak

В этой попытке я попытался вызвать переопределенный метод разрешения HeaderBasedKeycloakConfigResolver's и после того, как закалял web.xml. Я мог бы отметить, что его можно вызвать до того, как произойдет аутентификация. Я также прочитал некоторые значения заголовка запроса, но нет установщика, который бы устанавливал заголовки запроса туда (на org.keycloak.adapters.spi.HttpFacade.Request).

Ищете подсказку по установке заголовка запроса до того, как аутентификация Keycloak произойдет тем или иным способом?

  • Версия ключа claok: 3.1.0.Final

HeaderBasedKeycloakConfigResolver.java

public class HeaderBasedKeycloakConfigResolver implements KeycloakConfigResolver {

    @Override
    public KeycloakDeployment resolve(Request request) {

        String uri = request.getURI();
        logger.info("resolve().uri : " + uri);

        String auth_key = request.getHeader("auth_key");
        logger.info("resolve().auth_key : " + auth_key);

        request.setHeader("Autherization","<auth value>"); // there's no this like setter

        KeycloakDeployment deployment = cache.get(applicationId);
        --build deployment using the keycloak.json"

        return deployment;
    }

}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">

    <!-- more security-constraint -->

    <!-- keycloak -->

    <context-param>
        <param-name>keycloak.config.resolver</param-name>
        <param-value>package.to.class.HeaderBasedKeycloakConfigResolver</param-value>
    </context-param>

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>REST endpoints</web-resource-name>
            <url-pattern>/ep-name/resource-name</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>resource-name</role-name>
        </auth-constraint>
    </security-constraint>

    <!-- more security-constraint -->
    <!-- more security-constraint -->
    <!-- more security-constraint -->

     <login-config>
        <auth-method>KEYCLOAK</auth-method>
        <realm-name>realm-name</realm-name>
    </login-config>

    <security-role>
        <role-name>role-name-for-resource-1</role-name>
        <role-name>role-name-for-resource-2</role-name>
        <!-- more security-role -->
        <!-- more security-role -->
        <!-- more security-role -->
    </security-role>

    <listener>
        <listener-class>
            org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
    </listener>

    <servlet>
        <servlet-name>resteasy-servlet</servlet-name>
        <servlet-class>
            org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>resteasy-servlet</servlet-name>
        <url-pattern>/resource-path/*</url-pattern>
    </servlet-mapping>

</web-app>

person namalfernandolk    schedule 28.09.2018    source источник
comment
Используете ли вы в своем приложении какой-либо адаптер Keycloak? Что вы имеете в виду под before authentication happens? Аутентификация НИКОГДА не происходит в адаптере, происходит то, что приложение проверяет действительность отправляемого заголовка авторизации. Если у вас неправильный или у вас его нет, вы просто перенаправляетесь на страницу входа в keycloak.   -  person Xtreme Biker    schedule 28.09.2018
comment
@XtremeBiker, да, в моей реальной проблеме я хочу добавить токен носителя аутентификации keycloak (полученный через API обмена токенами keycloak) на сервере до того, как произойдет аутентификация keycloak. Там сначала я попробовал фильтр serevelt. Но он вызывает после аутентификации keycloak. Здесь я могу получить вызов KeycloakConfigResolver до того, как произойдет аутентификация. Но здесь нет возможности установить заголовок. Я подробно описал проблему здесь: stackoverflow.com/questions/51387730/.   -  person namalfernandolk    schedule 29.09.2018


Ответы (1)


Поскольку вы используете ограничения безопасности в своей конфигурации, вы можете сделать это:

public class CustomConstraintSecurityHandler extends ConstraintSecurityHandler{

    @Override
    public void handle(String pathInContext, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException{

        try {
            // change the request
            super.handle(pathInContext, baseRequest, request, response);            
        }catch(Exception e) {

        }

    }
}

Ранее я не использовал конфигурацию на основе xml, но в конфигурации Java я использовал ConstraintSecurityHandler примерно так:

    ContextHandlerCollection contexts = new ContextHandlerCollection();
    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS | ServletContextHandler.SECURITY );
KeycloakJettyAuthenticator kcAuthenticator = // set keycloak through JSON
    CustomConstraintSecurityHandler securityHandler = new CustomConstraintSecurityHandler();
    ConstraintMapping constraintMapping = new ConstraintMapping();
    constraintMapping.setPathSpec("/*");                
    Constraint constraint = new Constraint();           
    constraint.setAuthenticate(true);
    constraint.setRoles(new String[]{"**"});
    constraintMapping.setConstraint(constraint);                
    securityHandler.addConstraintMapping(constraintMapping);                            
    securityHandler.setAuthenticator(kcAuthenticator);
    context.setSecurityHandler(securityHandler);

РЕДАКТИРОВАТЬ:

Мой ответ основан на том факте, что ConstraintSecurityHandler предшествует обработчику аутентификации keycloak в трассировке стека отладки.

person tryingToLearn    schedule 03.10.2018