Я использую аутентификацию на основе заголовка 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>
before authentication happens
? Аутентификация НИКОГДА не происходит в адаптере, происходит то, что приложение проверяет действительность отправляемого заголовка авторизации. Если у вас неправильный или у вас его нет, вы просто перенаправляетесь на страницу входа в keycloak. - person Xtreme Biker   schedule 28.09.2018