빈 등록 httpSessionManager가 중복되어 Spring Boot 2.1에서 Keycloak을 사용할 수 없습니다.
Spring Boot 2.1 앱을 Keyclock 4.5로 보호하고 싶습니다.
현재 아래 오류로 인해 애플리케이션을 시작할 수 없습니다.
Exception encountered during context initialization - cancelling refresh attempt:
org.springframework.beans.factory.support.BeanDefinitionOverrideException:
Invalid bean definition with name 'httpSessionManager' defined in class path resource [dummy/service/SecurityConfig.class]:
Cannot register bean definition [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=securityConfig; factoryMethodName=httpSessionManager; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [dummy/SecurityConfig.class]] for bean 'httpSessionManager':
There is already [Generic bean: class [org.keycloak.adapters.springsecurity.management.HttpSessionManager]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in URL [jar:file:/.m2/repository/org/keycloak/keycloak-spring-security-adapter/4.5.0.Final/keycloak-spring-security-adapter-4.5.0.Final.jar!/org/keycloak/adapters/springsecurity/management/HttpSessionManager.class]] bound.
내 클래스 SecurityConfig(아래 참조)는 Keycloak Web SecurityConfigrAdapter에서 확장됩니다.이 어댑터는 이미 bean httpSessionManager를 정의하고 있습니다.
이게 왜 문제인지 알겠어요.문제는 어떻게 하면 이 문제를 예방하거나 충돌을 해결할 수 있는가 하는 것입니다.
지금까지의 순서는, 다음과 같습니다.
- 다음을 사용하여 내 폼(아래 참조)을 만듭니다.
- 스프링 부츠 웹
- 스프링 부츠 보안
- 키클로크 스프링 부츠 리셋
- 의존관리의 keycloak-adapter-bom
- Keycloak Web Security Configr Adapter를 확장하는 자체 Security Config 정의
pom.xml
...
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>11</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<keycloak.version>4.5.0.Final</keycloak.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-spring-boot-starter</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.keycloak.bom</groupId>
<artifactId>keycloak-adapter-bom</artifactId>
<version>${keycloak.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
...
SecurityConfig.java
@KeycloakConfiguration
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Import(KeycloakWebSecurityConfigurerAdapter.class)
class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) {
KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
auth.authenticationProvider(keycloakAuthenticationProvider);
}
@Bean
@Override
protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
}
@Bean
public KeycloakConfigResolver keycloakConfigResolver() {
return new KeycloakSpringBootConfigResolver();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.csrf().ignoringAntMatchers("/**/*");
http.authorizeRequests()
.anyRequest().permitAll();
}
}
업데이트 알려진 문제가 있습니다(KEYLOAK-8725).수정은 Keyclock 5.x로 예정되어 있습니다.그런데 댓글에 회피책이 있었어요.주석 @KeyCloakConfiguration을 다음과 같이 바꿉니다.
@Configuration
@ComponentScan(
basePackageClasses = KeycloakSecurityComponents.class,
excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.keycloak.adapters.springsecurity.management.HttpSessionManager"))
@EnableWebSecurity
이것은 문제를 해결하는 데 도움이 되었습니다.@KeycloakConfiguration
대신 이것을 사용합니다(KEYCLOAK-8725).
자바:
@Configuration
@ComponentScan(
basePackageClasses = KeycloakSecurityComponents.class,
excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.keycloak.adapters.springsecurity.management.HttpSessionManager"))
@EnableWebSecurity
코틀린:
@Configuration
@ComponentScan(
basePackageClasses = [KeycloakSecurityComponents::class],
excludeFilters = [ComponentScan.Filter(type = FilterType.REGEX, pattern = ["org.keycloak.adapters.springsecurity.management.HttpSessionManager"])]
)
@EnableWebSecurity
Keycloak의 Spring Security 통합에 버그가 있는 것 같습니다.즉, 서브클래스를 하는 어플리케이션은KeycloakWebSecurityConfigurerAdapter
이름 붙여진 두 개의 콩을 만들려고 합니다.httpSessionManager
. 두 개의 콩이 동일한 이름으로 정의되어 있는 경우 두 번째 정의가 첫 번째 정의를 덮어씁니다.이 덮어쓰기는 Spring Boot 2.1에서는 디폴트로 금지되어 있습니다.Keycloak의 Spring Security 통합에 대한 버그로 보고할 것을 권장합니다.버그가 해결되기를 기다리는 동안 이 문제를 해결하려면spring.main.allow-bean-definition-overriding=true
에application.properties
.
복제에 대처하기 위해 선호하는 방법HttpSessionManager
bean의 정의는 이 bean의 생성을 덮어쓰는 것입니다.SecurityConfig
다음과 같이 인스턴스화에 조건부 주석을 추가합니다.
@KeycloakConfiguration
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Import(KeycloakWebSecurityConfigurerAdapter.class)
class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
@Bean
@Override
@ConditionalOnMissingBean(HttpSessionManager.class)
protected HttpSessionManager httpSessionManager() {
return new HttpSessionManager();
}
}
사용하고 있다keycloak-spring-security-adapter
버전으로는6.0.1
제거할 솔루션@KeycloakConfiguration
특별한 구성을 가진 경우에는 작동하지 않았습니다.
제 솔루션은 다음 행을 추가하는 것이었습니다.application.properties
:
spring.main.allow-bean-definition-overriding: true
이 오류를 제거하는 가장 좋은 방법은 이 오류를 제외하는 것입니다.KeyCloakAutoCOnfiguration
Spring Boot 시작 시 클래스 로드
아래 내용을 추가해 주세요.application.yaml
spring:
autoconfigure:
exclude:
org.keycloak.adapters.springboot.KeycloakAutoConfiguration
언급URL : https://stackoverflow.com/questions/53318134/unable-to-use-keycloak-in-spring-boot-2-1-due-to-duplicated-bean-registration-ht
'sourcecode' 카테고리의 다른 글
credentials를 사용한Http 요청은 무엇이며 왜 사용하는가? (0) | 2023.03.05 |
---|---|
Json을 사용하여 이종 JSON 어레이를 공변량 목록으로 역직렬화 <>.그물 (0) | 2023.03.05 |
AngularJS 지시 다이내믹 템플릿 (0) | 2023.03.05 |
같은 스테이트먼트에서 입력과 집약을 어떻게 사용하는가? (0) | 2023.03.05 |
Larabel에 JSON 게시 (0) | 2023.02.28 |