gpt4 book ai didi

java - Spring RefreshableKeycloakSecurityContext 内存泄漏

转载 作者:行者123 更新时间:2023-11-30 02:04:35 36 4
gpt4 key购买 nike

我正在 Spring Boot 2.0.3 中开发应用程序。当大量带有 token 的 REST 请求发送到应用程序时,由于 RefreshableKeycloakSecurityContext,应用程序会出现内存泄漏。帖子按钮上的照片描述了它。

keycloak依赖项:

    <dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-spring-boot-2-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-admin-client</artifactId>
<version>3.4.0.Final</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-server-spi</artifactId>
<version>3.4.3.Final</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-events-api</artifactId>
<version>1.0.2.Final</version>
<type>jar</type>
</dependency>

安全配置:

     public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
try {
KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
auth.authenticationProvider(keycloakAuthenticationProvider);
}catch(Exception ex){
log.error(ex);
}
}

@Bean
public KeycloakSpringBootConfigResolver KeycloakConfigResolver() {
return new KeycloakSpringBootConfigResolver();
}

@Bean
@Override
protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
}

@Override
protected void configure(HttpSecurity http) {
try {
super.configure(http);
http
.cors()
.configurationSource(corsConfigurationSource())
.and()
.authorizeRequests()
.antMatchers("/api/public/**")
.permitAll();
http.csrf().disable();
}catch (Exception ex){
throw new RuntimeException("Problem podczas uprawnien " + ex);
}

}

@Bean
CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Arrays.asList("*"));
configuration.setAllowedMethods(Arrays.asList("GET","POST","PUT","DELETE", "OPTIONS"));
configuration.setAllowedHeaders(Arrays.asList("Access-Control-Allow-Origin","Origin","Accept,X-Requested-With","Content-Type","Access-Control-Request-Method","Access-Control-Request-Headers","Authorization"));
configuration.setMaxAge((long)1);
configuration.setAllowCredentials(true);

UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}

}

Memory leak image

谁能帮忙解决这个问题吗?

最佳答案

问题出在 SecurityConfig 类中。您使用:

@Bean
@Override
protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
return new
RegisterSessionAuthenticationStrategy(newSessionRegistryImpl());
}

在这个类中你可以看到:

public class RegisterSessionAuthenticationStrategy implements SessionAuthenticationStrategy {
private final SessionRegistry sessionRegistry;

public RegisterSessionAuthenticationStrategy(SessionRegistry sessionRegistry) {
Assert.notNull(sessionRegistry, "The sessionRegistry cannot be null");
this.sessionRegistry = sessionRegistry;
}

public void onAuthentication(Authentication authentication, HttpServletRequest request, HttpServletResponse response) {
this.sessionRegistry.registerNewSession(request.getSession().getId(), authentication.getPrincipal());
}

}

代码:

public void onAuthentication(Authentication authentication, HttpServletRequest request, HttpServletResponse response) {
this.sessionRegistry.registerNewSession(request.getSession().getId(), authentication.getPrincipal());
}

导致你的问题。你所有的休息都会创造出被 Spring 铭记的 session 。为了避免这种情况,您应该使用:

@Bean
@Override
protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
return new NullAuthenticatedSessionStrategy();
}

将 SecurityConfig 类中的 RegisterSessionAuthenticationStrategy 替换为 NullAuthenticatedSessionStrategy。

执行此操作后,您的应用程序将不再记住该 session 。 (检查前后的内存转储)。

更多信息在这里:https://github.com/dynamind/grails3-spring-security-keycloak-minimal/blob/master/README.md

关于java - Spring RefreshableKeycloakSecurityContext 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51727429/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com