繁体   English   中英

错误没有可用的“org.springframework.security.oauth2.jwt.JwtDecoder”类型的合格bean

[英]ERROR No qualifying bean of type 'org.springframework.security.oauth2.jwt.JwtDecoder' available

我正在尝试为我的 controller 编写测试,但测试环境无法使用给定的 stackTrace 加载。

    @PreAuthorize("hasAuthority('my.scope')")
    @GetMapping(value = "/path", produces = APPLICATION_JSON_VALUE)
    public ResponseEntity<Map<String, Set<String>>> getPath() {
        return myService.pathFunction()
            .map(ResponseEntity::ok);
    }

以下是我如何配置我的安全配置

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class WebConfig extends WebSecurityConfigurerAdapter {

    private static final String PRINCIPAL = "sub";

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        JwtAuthenticationConverter authenticationConverter =
            new JwtAuthenticationConverter();
        authenticationConverter.setJwtGrantedAuthoritiesConverter(...);
        authenticationConverter.setPrincipalClaimName(PRINCIPAL);

        http.csrf().disable()
            .cors()
            .and()
            .authorizeRequests().antMatchers("/actuator/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .oauth2ResourceServer()
            .jwt()
            .jwtAuthenticationConverter(authenticationConverter);
    }
}

controller 按需要工作,但我的测试因此错误而失败。 我没有使用任何客户 JwtDecoder

@WebMvcTest(controllers = Controller.class)
class ControllerTest {

    @MockBean
    private MyService myService;

    @Autowired
    private MockMvc mockMvc;

    @Test
    @WithMockUser(authorities = {"my.scope"})
    void controllerTest() throws Exception{
        Map<String, Set<String>> mapResponse = Map.of("key", Set.of("foo1", "foo2"));
        Mockito.when(myService.pathFunction()).thenReturn(Optional.of(mapResponse));

        MockHttpServletResponse result = mockMvc.perform(get("/configuration/api-registry")
                .contentType(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andReturn()
            .getResponse();

        String response = result.getContentAsString();
        assertTrue(response.contains("foo1"));
    }

}

如何运行此测试?

java.lang.IllegalStateException: Failed to load ApplicationContext

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springSecurityFilterChain' defined in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.servlet.Filter]: Factory method 'springSecurityFilterChain' threw exception; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.security.oauth2.jwt.JwtDecoder' available
    ...
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.servlet.Filter]: Factory method 'springSecurityFilterChain' threw exception; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.security.oauth2.jwt.JwtDecoder' available
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653)
    ... 90 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.security.oauth2.jwt.JwtDecoder' available
    at ...

我在测试中添加了 mocking 解码器为

@MockBean
private JwtDecoder jwtDecoder;

并且测试运行了!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM