Java @创建名为';证券配置';

Java @创建名为';证券配置';,java,spring,spring-boot,spring-test,spring-test-mvc,Java,Spring,Spring Boot,Spring Test,Spring Test Mvc,我有一个SpringBootREST应用程序,我在其中使用JWT进行身份验证,当我刚刚启动应用程序时,它可以正常工作 我只是想添加一些测试用例,但我无法解决这个问题(我使用mvn test运行测试用例: 错误表明Spring无法创建userDetailsService bean,但这似乎不正确,因为我的应用程序可以毫无问题地运行 不是:我试图通过@MockBean添加userdetailservice mock。但是这次spring显示了MyAuthenticationEntryPoint的相同

我有一个SpringBootREST应用程序,我在其中使用JWT进行身份验证,当我刚刚启动应用程序时,它可以正常工作

我只是想添加一些测试用例,但我无法解决这个问题(我使用
mvn test
运行测试用例:

错误表明Spring无法创建userDetailsService bean,但这似乎不正确,因为我的应用程序可以毫无问题地运行

不是:我试图通过@MockBean添加userdetailservice mock。但是这次spring显示了MyAuthenticationEntryPoint的相同错误。我认为应该有一个解决方案来自动添加所有配置,或者避免此端点的所有配置

[ERROR] verifyRegisterUserHttpRequest  Time elapsed: 0.008 s  <<< ERROR!
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'securityConfiguration': Unsatisfied dependency expressed 
through field 'userDetailsService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type 'com.myProjects.sample.security.MyUserDetailsService' available: expected at least 1 bean which qualifies as autowire candidate. 
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
  • 注册表控制器和安全配置
package com.myProjects.sample.controller;
@RestController
@请求映射(myweburl.API.API)
公共类注册控制器{
@自动连线
专用注册服务注册服务;
@自动连线
私有验证服务验证服务;
@PostMapping(myweburl.Register.Register\u用户)
公共响应身份注册服务器(@Valid@RequestBody NewCustomerRequest NewCustomerRequest,BindingResult BindingResult){
String validationResultMessage=validationService.getFirstValidationErrorMessage(bindingResult);
// ...
}
}
}
package com.myProjects.sample.security;
@配置
@启用Web安全性
@启用全局方法安全性(
//securedEnabled=true,
//jsr250Enabled=true,
preprestenabled=true)
公共类安全配置扩展了WebSecurity配置适配器{
@自动连线
私有MyUserDetails服务UserDetails服务;
@自动连线
私用MyAuthenticationEntryPoint未经授权的Handler;
@自动连线
私有CustomAccessDeniedHandler accessDeniedHandler;
@豆子
公共AuthTokenFilter authJwtTokenFilter(){
返回新的AuthTokenFilter();
}
@凌驾
public void configure(AuthenticationManagerBuilder AuthenticationManagerBuilder)引发异常{
authenticationManagerBuilder.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
// ....
  • 还可以查看我的自定义详细信息服务类
package com.myProjects.sample.security;
@服务
公共类MyUserDetailsService实现UserDetailsService{
@凌驾
@交易的
public UserDetails loadUserByUsername(字符串emailOrMobilePhone)引发UsernameNotFoundException{
// ...
}
}

能否将以下依赖项添加到项目中

<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-test</artifactId>
  <scope>test</scope>
</dependency>


您可以找到有关
MockMvc
和Spring安全集成的更多信息。

您需要在您的测试类中自动连接或模拟您的userDetialService,我已经尝试过了,但这次名为AuthenticationEntryPoint的bean和Jwt也会出现相同的错误……我认为应该有一种方法不在这个cas中启用安全性一种方法是创建一个概要文件,并用@profile(!test)装饰您的Springbean,当运行测试类时,将装饰器保持为@ActiveProfiles(“test”),这似乎是正确的方法,我的解决方案是通过
@MockBean
注释注释每个所需的bean。因为这个控制器(RegisterController)不需要受Spring应用程序的保护。毕竟我有这样的mockbean对象:
@mockbean private MyUserDetails服务UserDetails服务;@mockbean private MyAuthenticationEntryPoint unauthorizedHandler;@mockbean private CustomAccessDeniedHandler accessDeniedHandler;@mockbean private JwtUtils JwtUtils;
所以你可以是要修复您的问题还是问题仍然存在?@riekpill,是的,我可以修复它,但如果控制器需要保护,我正在使用
@SpringBootTest
注释,我想我也可以使用您的解决方案
@Test
@WithMockUser("duke")
@Test
public void testWithSecurityMockMvcRequestPostProcessors() throws Exception {
  this.mockMvc
    .perform(
      post("/your/endpoint")
        .with(jwt())
        .with(csrf())
    )
    .andExpect(status().isOk());

}