SpringBoot2 + Webflux - WebTestClient 总是返回“401 UNAUTHORIZED”

Nan*_*Nan 2 junit spring spring-security spring-boot spring-webflux

我正在尝试在 Springboot 2.1.8 和 Junit5 下使用 WebTestClient 编写一些测试

它总是返回 < 401 UNAUTHORIZED Unauthorized,但实际上它根本没有进入控制器或服务层。它可能与弹簧安全有关,只是我的猜测。

该项目是使用 JHipster 生成的。这是build.gradle

-----------------UimApiServiceImplTest.java-------------------

...


@ExtendWith(SpringExtension.class)
@WebFluxTest(controllers = UserGuidController.class)
@ContextConfiguration(classes = {UserGuidController.class, UimApiServiceImpl.class})

public class UimApiServiceImplTest {

    @Autowired
    private WebTestClient webTestClient;

    @Test
    public void testGetGuidByEmail() {

        webTestClient.get()
            .uri("/uimapi/getguid/{email}", "someone@xxxxx.com")
            .accept(MediaType.APPLICATION_JSON_UTF8)
            .exchange()
            .expectStatus().isOk();
    }
}
Run Code Online (Sandbox Code Playgroud)

--------------------UserGuidController.java--------------------

...
@RestController
@RequestMapping("/uimapi")
public class UserGuidController {

    @Autowired
    private UimApiServiceImpl uimApiService;

    private static final Logger logger = LoggerFactory.getLogger(UserGuidController.class);

    @GetMapping("/getguid/{email}")
    public String getUserGuid(@PathVariable String email) {
        return uimApiService.getUserGuid(email);
    }
}
Run Code Online (Sandbox Code Playgroud)

Cod*_*per 6

对于 webflux,您可以通过排除 ReactiveSecurityAutoConfiguration 类来禁用 SecurityAutoconfiguration,如下所示:

@WebFluxTest(controllers = YourController.class,excludeAutoConfiguration = {ReactiveSecurityAutoConfiguration.class}))
Run Code Online (Sandbox Code Playgroud)


Akh*_*dla 5

你已经implementation "org.springframework.boot:spring-boot-starter-security在你的 gradle 依赖项中。默认情况下,当在类路径中找到这个依赖项时,Spring boot 会自动在所有端点上启用安全性。

您可以选择通过更新主类来禁用此默认配置:

@SpringBootApplication(exclude = { SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class })
Run Code Online (Sandbox Code Playgroud)

这将禁用所有端点的安全性。

如果您想控制要从中删除安全性的端点,您可以使用以下代码和符合您要求的更新来做到这一点:

@Configuration
public class SecurityConfiguration {

  @Bean
  public SecurityWebFilterChain securityFilterChain(ServerHttpSecurity http) {
    http.authorizeExchange().anyExchange().permitAll();
    return http.build();
  }
}
Run Code Online (Sandbox Code Playgroud)