我在 Spring 安全测试中遇到 stackOverflowError

Lak*_*o12 6 java spring-security spring-test maven spring-boot

安全配置类

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConf {

    @Bean
    public AuthenticationManager authenticationManagerBean(AuthenticationConfiguration authenticationConfiguration) throws Exception {
        return authenticationConfiguration.getAuthenticationManager();
    }

}
Run Code Online (Sandbox Code Playgroud)

控制器

@RestController
public class Controller {
    
    @GetMapping("/test")
    public String test(){
        return "test";
    }
}
Run Code Online (Sandbox Code Playgroud)

测试班

@ExtendWith(SpringExtension.class)
@WebMvcTest(controllers = Controller.class)
@ComponentScan("com.example.demo")
public class DemoApplicationTests {

    @Test
    public void test() {
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个简单的应用程序,如果我尝试启动主应用程序,它可以工作,但是当我启动测试类时,我收到此错误:

java.lang.StackOverflowError
            at java.base/java.lang.StackTraceElement.of(StackTraceElement.java:526)
            at java.base/java.lang.Throwable.getOurStackTrace(Throwable.java:828)
            at java.base/java.lang.Throwable.getStackTrace(Throwable.java:820)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:79)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
            at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:89)
    and it always continues the same way ...
Run Code Online (Sandbox Code Playgroud)

在调试中我尝试恢复错误但我只看到这个java.lang.IllegalStateException: Failed to unwrap proxied object.

该测试仅在我删除authenticationManagerBean但需要authenticationManagerBean注入AutthenticationManager我的应用程序时才有效。

我知道我可以使用WebSecurityConfigurerAdapter然后添加 bean 来覆盖此类的方法。但由于WebSecurityConfigurerAdapter已弃用,我不想使用它。

这个问题是由于我已经从WebSecurityConfigurerAdapterSecurityFilterChain 切换到 SecurityFilterChain 并且在更改配置类时收到此错误

我创建了这个简单的项目,它复制了我的主项目的错误。如果您尝试启动该应用程序,它可以工作,但测试却不能。https://github.com/lako12/demo

项目很简单,只有3个类加上一个测试类。

Lak*_*o12 2

我在 spring github 上打开了一个问题,它被报告为一个错误,将由 spring 框架版本 5.3.24 修复。这是讨论的链接。 https://github.com/spring-projects/spring-framework/issues/29215