gpt4 book ai didi

java - 如何对受 keycloak 保护的 SpringBoot Controller 进行单元测试?

转载 作者:行者123 更新时间:2023-12-01 13:45:29 24 4
gpt4 key购买 nike

我知道已经有类似的问题了,herehere ,关于这个问题,但提出的每个解决方案都未能帮助我。还有提到this大多数答案中的库,但是(恕我直言)我想避免依赖外部库来测试一个简单的 Controller 。

所以,我有一个非常简单的 api,可以使用 keycloak 生成的不记名 token 进行访问,我想测试 Controller 。这些方面的东西:

@Test
@DisplayName("Should be ok")
@WithMockUser
void whenCalled_shouldBeOk() throws Exception {
SecurityContext context = SecurityContextHolder.getContext();
Authentication authentication = context.getAuthentication();
mockMvc.perform(
post("/api/url/something")
.content("{}")
.contentType(APPLICATION_JSON)
.with(authentication(authentication))
).andExpect(status().isOk());
}

问题是我总是会得到 KeycloakDeploymentBuilder 抛出的空指针异常。因为它缺少适配器配置。在我们的 SecurityConfig 中,我们扩展了 KeycloakWebSecurityConfigurerAdapter并为应用程序工作进行所有必需的配置,但我未能在测试中模拟/绕过此过程。通常我会在使用 @WithMockUser 注释的测试中(当不使用 keycloak 时)找到解决此身份验证问题的方法,但这次不是。

没有办法模拟适配器或过滤器进程以绕过这个问题吗?

我已经尝试了其他问题(图书馆除外)中回答的所有问题,但没有成功。如果您有任何可能有帮助的线索或至少为我指明正确的方向(因为这可能是由于我对 Spring 安全性缺乏了解),我们将不胜感激。

最佳答案

正如我在对您链接的第一个问题的回答中所写的那样,@WithMockUserUsernamePaswordAuthenticationToken 填充安全上下文当您的代码/配置可能期望 KeycloakAuthenticationToken .
如果您仔细阅读相同的答案,您会找到使用我的 lib 执行此操作的替代方法:使用 KeycloakAuthenticationToken 手动填充安全上下文每个测试中的实例或模拟。
最小 带有 Mockito I 的 sample added to my repo :

    @Test
public void test() {
final var principal = mock(Principal.class);
when(principal.getName()).thenReturn("user");

final var account = mock(OidcKeycloakAccount.class);
when(account.getRoles()).thenReturn(Set.of("offline_access", "uma_authorization"));
when(account.getPrincipal()).thenReturn(principal);

final var authentication = mock(KeycloakAuthenticationToken.class);
when(authentication.getAccount()).thenReturn(account);

// post(...).with(authentication(authentication))
// limits to testing secured @Controller with MockMvc
// I prefer to set security context directly instead:
SecurityContextHolder.getContext().setAuthentication(authentication);

//TODO: invoque mockmvc to test @Controller or test any other type of @Component as usual
}
也许,在您确定这会使您的测试变得多么困惑(这里很少声明)之后,您会重新考虑使用我的库(或者从它复制,因为它是开源的)。
使用我的注释,上面的示例变为:
    @Test
@WithMockKeycloakAuth
public void test() throws Exception {
//TODO: invoque mockmvc to test @Controller or test any other type of @Component as usual
}
关于涉及 Keycloak 的 spring 测试配置,您可以深入了解 spring-security-oauth2-test-webmvc-addons 的测试。模块。你会找到一个 complete app using KeycloakAuthenticationToken 带有单元测试(和工作测试配置)

关于java - 如何对受 keycloak 保护的 SpringBoot Controller 进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62199105/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com