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

时间:2019-10-11 20:26:43

标签: spring spring-boot junit spring-security spring-webflux

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

它总是返回<401 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();
    }
}

-------------------- 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);
    }
}

2 个答案:

答案 0 :(得分:2)

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

@WebFluxTest(controllers = YourController.class,excludeAutoConfiguration = {ReactiveSecurityAutoConfiguration.class}))

答案 1 :(得分:0)

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

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

@SpringBootApplication(exclude = { SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class })

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

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

@Configuration
public class SecurityConfiguration {

  @Bean
  public SecurityWebFilterChain securityFilterChain(ServerHttpSecurity http) {
    http.authorizeExchange().anyExchange().permitAll();
    return http.build();
  }
}