我的团队正在使用Auth0保护我们所有的Spring Boot服务。它可以在99%的时间内正常运行,但是我们的其中一项服务在收到请求时会失败,并返回空指针。
这仅在使用Linux构建映像并针对服务运行@SpringBootTest测试时在CI构建期间发生。在开发人员机器上,一切都很好,在Windows构建映像上,一切都很好。
失败的服务在所有我能找到的其他方面都是相同的,所以这对我来说是个谜。
失败的代码在Auth0春季安全性库的BearerSecurityContextRepository中。
相关代码如下:
SecurityContext context = SecurityContextHolder.createEmptyContext();
String token = tokenFromRequest(requestResponseHolder.getRequest());
Authentication authentication = PreAuthenticatedAuthenticationJsonWebToken.usingToken(token);
if (authentication != null) {
context.setAuthentication(authentication);
logger.debug("Found bearer token in request. Saving it in SecurityContext");
}
第5行上的上下文对象返回null并爆炸。我查看了SecurityContextHolderStrategy可以使用的每种可能的实现,该实现都在类路径上,并且看不到createEmptyContext()调用返回为null的任何情况。每个实现似乎都只是返回一个新的SecurityContextImpl。
在我看来,这一定是导致此问题的Linux构建映像环境中的某件事(我们构建的后期部分要求我们使用Linux或我只是切换到Windows映像)。
我希望真正了解Spring安全性内部知识的人可以给我一些提示,指出可能是什么原因导致该问题,以便我可以更深入地了解图像。或者,如果我不在基地上,那又是另外一回事,那就是可以拯救生命的指针。
谢谢!