错误 'org.springframework.security.oauth2.jwt.JwtDecoder' 类型的合格 bean 不可用
ERROR No qualifying bean of type 'org.springframework.security.oauth2.jwt.JwtDecoder' available
我正在尝试为我的控制器编写测试,但测试环境无法加载给定的 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);
}
}
控制器按需工作,但我的测试失败并出现此错误。我没有使用任何客户 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 ...
我在测试中添加了模拟解码器作为
@MockBean
private JwtDecoder jwtDecoder;
和测试 运行 !
我正在尝试为我的控制器编写测试,但测试环境无法加载给定的 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);
}
}
控制器按需工作,但我的测试失败并出现此错误。我没有使用任何客户 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 ...
我在测试中添加了模拟解码器作为
@MockBean
private JwtDecoder jwtDecoder;
和测试 运行 !