我想为我的spring控制器编写单元测试,我使用keycloak的openid流来保护我的端点。
在我的测试中,我使用@WithMockUser
注解来模拟一个经过身份验证的用户,我的问题是我从主体的令牌中阅读userId,我的单元测试现在失败了,因为我从令牌中读取的userId
为空;
if (principal instanceof KeycloakAuthenticationToken) {
KeycloakAuthenticationToken authenticationToken = (KeycloakAuthenticationToken) principal;
SimpleKeycloakAccount account = (SimpleKeycloakAccount) authenticationToken.getDetails();
RefreshableKeycloakSecurityContext keycloakSecurityContext = account.getKeycloakSecurityContext();
AccessToken token = keycloakSecurityContext.getToken();
Map<String, Object> otherClaims = token.getOtherClaims();
userId = otherClaims.get("userId").toString();
}
有什么东西可以轻松地嘲笑KeycloakAuthenticationToken
吗?
1条答案
按热度按时间wj8zmpe11#
@WithmockUser
使用UsernamePasswordAuthenticationToken
配置安全上下文。这对于大多数用例来说都很好,但当您的应用依赖于另一个身份验证实现时(就像您的代码一样),您必须构建或模拟正确类型的示例,并将其放入测试安全上下文:SecurityContextHolder.getContext().setAuthentication(authentication);
当然,您很快就会希望自动执行此操作,构建自己的注解或
RequestPostProcessor
...或者...
取一个“现成的”,如这个lib of mine,它可从Maven-Central获得:
您可以将其与
@WithMockKeycloackAuth
标注一起使用:或MockMvc流畅API(请求后处理器):