如何 WebFluxTest 白色 ReactiveSecurityContextHolder

Posted

技术标签:

【中文标题】如何 WebFluxTest 白色 ReactiveSecurityContextHolder【英文标题】:How to WebFluxTest whit ReactiveSecurityContexHolder 【发布时间】:2020-05-04 05:03:37 【问题描述】:

这里是一个简单的类,从 spring 安全上下文中读取 Principal 用户:

public Mono<Void> getAndCheckAccessRights(Integer agencyKey) 
    return ReactiveSecurityContextHolder.getContext()
            .map(securityContext -> getAccessRights(agencyKey, securityContext.getAuthentication().getName()))
            .switchIfEmpty(Mono.defer(() -> 
                log.error("No security context found!");
                throw new AuthorizationException("No security context found!");
            ))
            .flatMap(accessRightsDtoMono -> checkAccessRights(accessRightsDtoMono))
            .then();


private Mono<AccessRightsDto> getAccessRights(Integer agencyKey, String bensl) 
    return dataServiceWebClient.get()
            .uri("/access_rights/" + agencyKey + "/" + bensl)
            .retrieve()
            .bodyToMono(AccessRightsDto.class)
            .switchIfEmpty(Mono.defer(() -> 
                log.error("No user found!");
                throw new AuthorizationException("No user found!");
            ));

虽然测试它不是它应该做的,但执行只是跳过代码行而不执行 .map 或 .flatMap 中的方法流, 没有打印日志,也没有任何级别的调试日志,测试只是运行,因为一切都正确终止,我不知道为什么会发生这种情况:

@WebFluxTest(AccessRightService.class)
...
@Test
@WithMockUser
void getAndCheckAccessRights_NOT_AUTHORIZED() throws JsonProcessingException 
    AccessRightsDto testAccessRightsDto = AccessRightsDto
            .builder(123456789, "test", "test", PUBLISH, PUBLISH, PUBLISH, PUBLISH, PUBLISH,
                    PUBLISH, PUBLISH, PUBLISH, NO_ACCESS)
            .build();
    MockResponse response = new MockResponse();
    response.setResponseCode(HttpStatus.OK.value()).setBody(objectMapper.writeValueAsString(testAccessRightsDto));
    mockWebServer.enqueue(response);
    assertThrows(AuthorizationException.class, () -> accessRightService.getAndCheckAccessRights(123456789));

运行应用程序时,它只是按预期正常工作,测试很奇怪!

使用 spring boot 2.2.2 和 okhttp3 mockwebserver 运行的应用程序。

【问题讨论】:

【参考方案1】:

我的错,我忘了把.block()放在getAndCheckAccessRights之后,它传播了获取对象的输入,但什么都不会发生。

实际上并不清楚它在 Netty 的情况下是如何工作的,因为它不接受 .block() 的但在测试中可以调用它。

【讨论】:

以上是关于如何 WebFluxTest 白色 ReactiveSecurityContextHolder的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring Security @Secured 注解测试 Spring Boot @WebFluxTest

从“@WebFluxTest”迁移到“@SpringBootTest”后,集成测试中的连接被拒绝

在 Oauth2 安全(客户端凭据)资源服务器应用程序中为 WebFluxTest 获取 403 禁止

如何在文字对象上正确使用接口

java 图片如何让白色变透明

photoshop 设置前背景的颜色为白色,如何将背景色指定为白色