spring-security 创建名为“customerSecurityConfig”的Bean时出错:通过字段“jwtAuthEntryPoint”表示的未满足的依赖关系

yvgpqqbh  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(195)

运行JUnit测试时出现异常

  1. java.lang.IllegalStateException: Failed to load ApplicationContext
  2. at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:132)
  3. at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:124)
  4. at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.postProcessFields(MockitoTestExecutionListener.java:110)
  5. at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.injectFields(MockitoTestExecutionListener.java:94)
  6. at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.prepareTestInstance(MockitoTestExecutionListener.java:61)
  7. at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:248)
  8. at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:138)
  9. at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$6(ClassBasedTestDescriptor.java:350)
  10. at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:355)
  11. at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$7(ClassBasedTestDescriptor.java:350)
  12. at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
  13. at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
  14. at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
  15. at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
  16. at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
  17. at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:310)
  18. at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735)
  19. at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734)
  20. at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
  21. at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:349)
  22. at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$4(ClassBasedTestDescriptor.java:270)
  23. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  24. at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:269)
  25. at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$2(ClassBasedTestDescriptor.java:259)
  26. at java.base/java.util.Optional.orElseGet(Optional.java:364)
  27. at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$3(ClassBasedTestDescriptor.java:258)
  28. at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31)
  29. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:101)
  30. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  31. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:100)
  32. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:65)
  33. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$1(NodeTestTask.java:111)
  34. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  35. at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:111)
  36. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:79)
  37. at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  38. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
  39. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143)
  40. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  41. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
  42. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  43. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
  44. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  45. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
  46. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
  47. at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  48. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
  49. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143)
  50. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  51. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
  52. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  53. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
  54. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  55. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
  56. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
  57. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
  58. at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
  59. at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
  60. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108)
  61. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)
  62. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54)
  63. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)
  64. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)
  65. at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96)
  66. at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:84)
  67. at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:98)
  68. at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:40)
  69. at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:529)
  70. at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:756)
  71. at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:452)
  72. at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)
  73. Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'customerSecurityConfig': Unsatisfied dependency expressed through field 'jwtAuthEntryPoint'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.cts.customermanager.security.JwtAuthenticationEntryPoint' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
  74. at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:659)
  75. at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:639)
  76. at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)
  77. at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
  78. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431)
  79. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619)
  80. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
  81. at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
  82. at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
  83. at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
  84. at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
  85. at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944)
  86. at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918)
  87. at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)
  88. at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:765)
  89. at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:445)
  90. at org.springframework.boot.SpringApplication.run(SpringApplication.java:338)
  91. at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:120)
  92. at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99)
  93. at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124)
  94. ... 70 more
  95. Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.cts.customermanager.security.JwtAuthenticationEntryPoint' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
  96. at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1790)
  97. at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1346)
  98. at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300)
  99. at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:656)
  100. ... 89 more

身份验证筛选器类

  1. package com.cts.customermanager.security;
  2. import java.io.IOException;
  3. import javax.servlet.FilterChain;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
  9. import org.springframework.security.core.context.SecurityContextHolder;
  10. import org.springframework.security.core.userdetails.UserDetails;
  11. import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
  12. import org.springframework.stereotype.Component;
  13. import org.springframework.util.StringUtils;
  14. import org.springframework.web.filter.OncePerRequestFilter;
  15. @Component
  16. public class JwtAuthenticationFilter extends OncePerRequestFilter{
  17. @Autowired
  18. private UserDetailService userService;
  19. @Autowired
  20. private JwtProvider jwtProvider;
  21. @Override
  22. protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
  23. throws ServletException, IOException {
  24. String header = request.getHeader("Authorization");
  25. String token =null, username = null;
  26. if(StringUtils.hasText(header) && SecurityContextHolder.getContext().getAuthentication()==null && header.startsWith("Bearer ")) {
  27. token = header.substring(7);
  28. username = jwtProvider.getUserName(token);
  29. }
  30. if(username!=null && jwtProvider.validateJWTToken(token)) {
  31. UserDetails userDetails = userService.loadUserByUsername(jwtProvider.getUserName(token));
  32. UsernamePasswordAuthenticationToken usernamePasswordAuthToken =
  33. new UsernamePasswordAuthenticationToken(userDetails,null, userDetails.getAuthorities());
  34. usernamePasswordAuthToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
  35. SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthToken);
  36. }
  37. filterChain.doFilter(request, response);
  38. }
  39. }

身份验证入口点

  1. package com.cts.customermanager.security;
  2. import java.io.IOException;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import org.springframework.security.core.AuthenticationException;
  7. import org.springframework.security.web.AuthenticationEntryPoint;
  8. import org.springframework.stereotype.Component;
  9. @Component
  10. public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint{
  11. @Override
  12. public void commence(HttpServletRequest request, HttpServletResponse response,
  13. AuthenticationException authException) throws IOException, ServletException {
  14. response.sendError(HttpServletResponse.SC_UNAUTHORIZED,authException.getMessage());
  15. }
  16. }

控制器测试类

  1. package com.cts.customermanager.controllerTest;
  2. import static org.hamcrest.CoreMatchers.is;
  3. import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
  4. import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
  5. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
  6. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. import org.junit.jupiter.api.Test;
  10. import org.mockito.Mockito;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
  13. import org.springframework.boot.test.mock.mockito.MockBean;
  14. import org.springframework.context.annotation.ComponentScan;
  15. import org.springframework.http.HttpHeaders;
  16. import org.springframework.http.MediaType;
  17. import org.springframework.security.web.AuthenticationEntryPoint;
  18. import org.springframework.test.web.servlet.MockMvc;
  19. import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
  20. import org.springframework.test.web.servlet.setup.MockMvcBuilders;
  21. import org.springframework.web.context.WebApplicationContext;
  22. import com.fasterxml.jackson.core.JsonProcessingException;
  23. import com.fasterxml.jackson.databind.ObjectMapper;
  24. import com.cts.customermanager.service.customerService;
  25. import com.cts.customermanager.util.Constants;
  26. @WebMvcTest
  27. public class CustomerControllerTest {
  28. @Autowired
  29. private MockMvc mockMvc;
  30. @Autowired
  31. private ObjectMapper objectMapper;
  32. @MockBean
  33. private CustomerService customerService;
  34. @Test
  35. public void addcustomerTest() throws JsonProcessingException, Exception {
  36. CustomerDto customerDto = getcustomerDto(); //method which returns dto object
  37. Mockito.when(customerService.addcustomer(Mockito.any(customerDto.class))).thenReturn(Constants.customer_ADDED_SUCCESS);
  38. mockMvc.perform(post("/customer")
  39. .contentType("application/json").header(HttpHeaders.AUTHORIZATION, "Bearer someToken")
  40. .content(objectMapper.writeValueAsString(customerDto)))
  41. .andExpect(status().isOk())
  42. .andExpect(MockMvcResultMatchers.content().string("Success"));
  43. }

安全配置类

  1. package com.cts.customermanager.config;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.http.HttpMethod;
  6. import org.springframework.security.authentication.AuthenticationManager;
  7. import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
  8. import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  9. import org.springframework.security.config.annotation.web.builders.WebSecurity;
  10. import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
  11. import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
  12. import org.springframework.security.config.http.SessionCreationPolicy;
  13. import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  14. import org.springframework.security.crypto.password.NoOpPasswordEncoder;
  15. import org.springframework.security.crypto.password.PasswordEncoder;
  16. import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
  17. import org.springframework.stereotype.Component;
  18. import com.cts.customermanager.security.JwtAuthenticationEntryPoint;
  19. import com.cts.customermanager.security.JwtAuthenticationFilter;
  20. import com.cts.customermanager.security.UserDetailService;
  21. @Component
  22. @Configuration
  23. @EnableWebSecurity
  24. public class CustomerSecurityConfig extends WebSecurityConfigurerAdapter{
  25. @Autowired
  26. private JwtAuthenticationEntryPoint jwtAuthEntryPoint;
  27. @Autowired
  28. private JwtAuthenticationFilter jwtAuthenticationFilter;
  29. @Autowired
  30. private UserDetailService userDetailService;
  31. @Bean
  32. PasswordEncoder passwordEncoder() {
  33. return new BCryptPasswordEncoder();
  34. }
  35. @Override
  36. protected void configure(HttpSecurity httpSecurity) throws Exception {
  37. httpSecurity.csrf().disable()
  38. .exceptionHandling()
  39. .authenticationEntryPoint(jwtAuthEntryPoint)
  40. .and()
  41. .sessionManagement()
  42. .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
  43. .and()
  44. .authorizeRequests()
  45. .antMatchers("/authenticate")
  46. .permitAll()
  47. .anyRequest()
  48. .authenticated();
  49. httpSecurity.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
  50. }
  51. @Override
  52. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  53. auth.userDetailsService(userDetailService).passwordEncoder(passwordEncoder());
  54. }
  55. @Bean
  56. @Override
  57. public AuthenticationManager authenticationManagerBean() throws Exception {
  58. return super.authenticationManagerBean();
  59. }
  60. }

控制器类

  1. package com.cts.customermanager.controller;
  2. import java.util.List;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.http.HttpStatus;
  5. import org.springframework.http.ResponseEntity;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.PathVariable;
  8. import org.springframework.web.bind.annotation.PostMapping;
  9. import org.springframework.web.bind.annotation.RequestBody;
  10. import org.springframework.web.bind.annotation.RestController;
  11. import org.springframework.web.server.ResponseStatusException;
  12. import com.cts.customermanager.dto.CustomerDto;
  13. import com.cts.customermanager.exceptions.CustomerNotFoundException;
  14. import com.cts.customermanager.service.CustomerService;
  15. import com.cts.customermanager.service.CustomerServiceImpl;
  16. @RestController
  17. public class CustomerDbController {
  18. @Autowired
  19. private CustomerService customerService;
  20. @PostMapping(value = "/customer")
  21. public ResponseEntity<String> addCustomer(@RequestBody CustomerDto customerDto) {
  22. String success = customerService.addCustomer(customerDto);
  23. return new ResponseEntity<String>(success, HttpStatus.OK);
  24. }
  25. }

我是spring安全实现的新手。我的应用程序运行得很好,但是当我尝试测试它(JUnit)时,我看到了上面提到的异常。有人能指出上面代码中的错误/缺失是什么导致了这个异常吗?谢谢注意:测试类上的@ComponentScan不起作用

wydwbb8l

wydwbb8l1#

我猜你的Spring bean上下文没有正确设置。尝试将下面的includeFilter添加到你的@ WebMvcTest注解中。

  1. @WebMvcTest( includeFilters = {
  2. @ComponentScan.Filter( classes = JwtAuthenticationEntryPoint .class )
  3. } )
  4. public class CustomerControllerTest {
  5. @Autowired
  6. private MockMvc mockMvc;
  7. @Autowired
  8. private ObjectMapper objectMapper;
  9. @MockBean
  10. private CustomerService customerService;
  11. ....

相关问题