如何解决@WithMockKeycloakAuth获取accesstoken作为承载字符串,用于MockMvc执行标头
我有一项服务,并且Keycloak 11作为身份验证服务器。现在我要编写测试。为了模拟访问令牌,我使用@WithMockKeycloakAuth。这样效果很好,例如,当我担任坏角色时,我会遭到未经授权。现在我想用spring rest docs记录它,为此我必须添加acesstoken作为头字段(Bearer tokenAsBearerString)。由于有注释,因此将模拟令牌添加到SecurityContext中,我可以在执行mvc.perform之前将其提取。
@Test
@Order(5)
@WithMockKeycloakAuth(authorities = "ROLE_owner")
void createProduct_RealmRoleOwner_HttpStatusCreated() throws Exception {
SecurityContext context = SecurityContextHolder.getContext();
KeycloakAuthenticationToken authentication =(KeycloakAuthenticationToken) context.getAuthentication();
AccessToken token = authentication.getAccount().getKeycloakSecurityContext().getToken();
问题是我需要将accesstoken作为Bearer字符串表示形式。我对jwt主题还不是很熟悉,但是我希望如果我使用模拟的acces令牌并将其转换为jwt格式/ Base 64编码的String,标题应该是正确的。
此外:我正在通过docker在单独的网络中运行Keycloak容器,因此在运行自动化测试时无法访问它。因此,嘲笑将是唯一的解决方案。
解决方法
还问了(并回答了)here这个问题,还有一点点背景。
上面提供的代码片段未显示测试类用@AutoConfigureMockMvc(addFilters = false)
装饰,这是为什么安全上下文未附加到MockMvc HTTP请求的原因(通常由spring-security过滤器完成)。
也没有提供完整的堆栈跟踪,但是启用过滤器时发生的异常很可能是由于Keycloak引导库中的JwtDecoder接线所致。 @MockBean JwtDecoder jwtDecoder;
应该足以修复它。
最后,它是lib @WithMockKeycloakAuth
的主要功能之一,它可以跳过从Keycloak实例获取,解码和解析实际JWT的操作。尝试通过模拟的Spring身份验证使用有效的JWT构建授权标头是...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。