Spring 引导管理:Jolokia 端点上的 401 导致身份验证失败

Spring Boot Admin: 401 on Jolokia endpoint causes authentication to fail

我正在使用 Spring-Boot-Admin in order to monitor a SpringBoot app whose actuator endpoints are secured using basic auth. The required credentials are transferred to Spring-Boot-Admin (SBA) like described in the documentation. SBA itself is also secured using spring-boot-admin-server-ui-login and the provided SecurityConfiguration (based on the documentation & sample apps, see Github Repo 作为代码)。 要监控的应用程序和 SBA 都是通过 docker.

部署的

登录到 SBA 工作正常,我可以看到应用程序状态以及运行状况结果。对于某些内容,我看到了一个嵌套的登录掩码。当我点击 "Logging" 或 "JMX" 时,我被重定向到登录掩码:

在浏览器的网络选项卡中,我可以看到 /jolokia 端点返回了 401。此后的所有请求似乎都被转发到登录页面。

我有以下问题:

  1. 如果对应用程序的一次请求失败,为什么我会注销?这是一个错误吗?
  2. 401 的来源是什么? SBA 还是我的应用程序?我知道 SBA 代理对应用程序的请求。根据我的应用程序的访问日志,当我登录 SBA 时,没有完成对 /jolokia 的请求。这是否意味着 401 是由 SBA 直接返回的?它的日志不包含任何相关内容。
  3. 直接访问 /jolokia 端点工作正常。当我使用 SBA 使用的相同(代理)URL(例如 http://XXX:8090/api/applications/XXX/jolokia/)时,它甚至可以工作。从 SBA 中执行时有什么不同?

我试图在 SBA 中查找更多错误详细信息,但到目前为止未能找到正确的日志记录选项。它们要么不包含任何相关信息,要么包含太多似乎不相关的信息(例如 Spring 安全性)。记录完整的回复可能会有所帮助...

编辑:我刚刚意识到,对 /jolokia 端点的请求实际上包含与对工作端点(例如 /metrics)的请求不同的 cookie (Cookie:JSESSIONID=4E51B84AE15A6890500F967B23EB92AC)。这很奇怪,但可能解释了为什么 /jolokia 端点 returns 是 401。现在的问题是:为什么它发送不同的 cookie?

我尝试了各种方法,但最终无法解决这个问题。

我最终得到了不同的配置:端点完全没有安全性 (management.security.enabled=false),但将它们暴露在不同的端口 (management.port=8081)。此管理端点已完全阻止外部访问系统。

这样一来,SBA 表现良好,应用程序仍然安全。最后,它的设置简单得多,这也很好。

我遇到了类似的问题。

我可以访问所有执行器端点,但所有带有 /jolokia 的内容都不会被授权。尽管我的安全设置与您的不同,但我认为问题是一样的。

当我深入研究时,我发现 jolokia 在其自己的 servlet 中运行,与 spring 引导应用程序分开。也许因此你有不同的会话!?

我的安全配置试图匹配这个表达式

.mvcMatchers("/actuator/**").access("hasAnyRole('ADMIN','SBA')"),

但 SBA 用户角色无法访问 Jolokia。它始终匹配最后一个 fallback-rule,其中只允许管理员。

在我的例子中,jolokia servlet 的上下文和 servlet-path 会在尝试将其与我的安全配置匹配之前从请求路径中删除。然后它只会将“/list”与我的 MVC 匹配器匹配,而不是“/actuator/jolokia/list”,这将不符合预期。

很遗憾,我没有解决您的问题的方法。对于我的情况,我添加了一个 requestMatchers 规则,该规则不那么自以为是并且仍然匹配:

.requestMatchers(请求 -> request.getRequestURI().contains(/actuator/jolokia/")).access("hasAnyRole('ADMIN','SBA')")

而不是

.mvcMatchers("/actuator/**").access("hasAnyRole('ADMIN','SBA')")