Spring не может найти keycloak.json
Я пишу базовое Spring приложение(без излишеств) с секьюрностю через keycloak.
keycloak у меня стартует через докер контейнер и стартует правильно без ошибок, все настройки из realm-export.json применяются верно, но при запуске Application (самого Spring приложения) я ловлю ошибку
Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
Причиной которой является то что Spring Не видит keycloak.json - это следует из строки ошибки ниже
Error creating bean with name 'keycloakAuthenticationProcessingFilter' defined in class path resource [org/example/config/SecurityConfig.class]: Invocation of init method failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'adapterDeploymentContext' defined in class path resource [org/example/config/SecurityConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.keycloak.adapters.AdapterDeploymentContext]: Factory method 'adapterDeploymentContext' threw exception; nested exception is java.io.FileNotFoundException: Unable to locate Keycloak configuration file: keycloak.json
Собственно вопрос - что делать?
Ниже на скриншоте структура приложения:
Вот SecurityConfig
package org.example.config;
import org.keycloak.adapters.springsecurity.KeycloakConfiguration;
import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider;
import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper;
import org.springframework.security.web.authentication.session.NullAuthenticatedSessionStrategy;
import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;
@KeycloakConfiguration
class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) {
KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
auth.authenticationProvider(keycloakAuthenticationProvider);
}
@Override
protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
return new NullAuthenticatedSessionStrategy();
}
}
application.properties:
keycloak.auth-server-url=http://localhost:8180/auth
keycloak.realm=Realm
keycloak.resource=Client
keycloak.public-client=true
keycloak.principal-attribute=preferred_username
keycloak.config.file=keycloak.json
DockerFile (там keycloak)
FROM jboss/keycloak
COPY realm-export.json /tmp/realm-export.json
CMD ["-b", "0.0.0.0", "-Dkeycloak.migration.action=import", "-Dkeycloak.migration.provider=singleFile", "-Dkeycloak.migration.file=/tmp/realm-export.json"]
Ну и сам keycloak.json
{
"realm": "Realm",
"auth-server-url": "http://localhost:8180/auth",
"ssl-required": "external",
"resource": "Client"
}
Ответы (1 шт):
Настройка поиска файла происходит в KeycloakWebSecurityConfigurerAdapter
@Value("${keycloak.configurationFile:WEB-INF/keycloak.json}")
private Resource keycloakConfigFileResource;
Для того чтобы класс нашел ваш файл нужно указать в application.properties:
keycloak.configurationFile=classpath:keycloak.json
