Spring Boot 3:Jetty Mgmt Server 允许 TRACE 方法调用

问题描述 投票:0回答:1

我使用

spring-boot-starter-jetty
actuator
制作了一个 Spring Boot 3 应用程序,其中
server.port != management.server.port

我希望服务器和管理端口上都不允许 TRACE 调用。

我尝试了多种方法,但我设法只阻止服务器端口的 TRACE,而 mgmt 端口上的服务器始终接受带有 200 OK 的 TRACE 调用。

跟进这个 Spring Boot 问题 ref

我做了以下测试应用程序来展示我所看到的

测试testTraceDisabledManagement不会通过

├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── example
│   │   │           ├── demo
│   │   │           │   ├── CustomDispatcherServlet.java
│   │   │           │   └── DemoApplication.java
│   │   │           └── server
│   │   │               └── MgmtServerConfiguration.java
│   │   └── resources
│   │       ├── META-INF
│   │       │   └── spring
│   │       │       └── org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration.imports
│   │       ├── application.properties
│   │       ├── static
│   │       └── templates
│   └── test
│       └── java
│           └── com
│               └── example
│                   └── demo
│                       └── DemoApplicationTests.java

测试

@Test
    public void testTraceDisabledApi() throws URISyntaxException {
        verifyTraceFails(this.apiPort); // OK - Jetty returns 405
    }

    /**
     * Tests that TRACE is disabled for the management endpoint.
     */
    @Test
    public void testTraceDisabledManagement() throws URISyntaxException {
        verifyTraceFails(this.managementPort); // KO - Jetty returns 200
    }

    private void verifyTraceFails(final int port) throws URISyntaxException {
        final String url = "http://localhost:" + port;
        RestTemplate restTemplate = new RestTemplate();
        try {
            RequestEntity<Void> requestEntity = new RequestEntity<>(TRACE, new URI(url));
            ResponseEntity<String> response = restTemplate.exchange(requestEntity, String.class);
            assertThat(response.getStatusCode(), Matchers.equalTo(METHOD_NOT_ALLOWED));
        }
        catch (org.springframework.web.client.HttpClientErrorException e) {
            assertThat(e.getStatusCode(), Matchers.equalTo(METHOD_NOT_ALLOWED));
            return;
        }
        catch (Exception e) {
            Assertions.fail("Should never reach this point", e);
        }
        Assertions.fail("Should never reach this point");
    }

项目结构

spring-boot jetty embedded-jetty jetty-12
1个回答
0
投票

我明白了问题所在。我使用 JettyServerCustomizer 类来配置 Jetty,但它似乎被管理服务器忽略了。

WebServerFactoryCustomizer 做到了这一点。

主帖中的项目已更新,并且测试正在通过。

-    JettyServerCustomizer mgmtJettyServerCustomizer() {
-        return (server) -> {
-            ServletContextHandler servletContextHandler = findServletContextHandler(server);
-            disableTraceMethodForHandler(servletContextHandler);
+    WebServerFactoryCustomizer<JettyServletWebServerFactory> disableSniHostCheck() {
+        return (factory) -> {
+            factory.addServerCustomizers((server) -> {
+                ServletContextHandler servletContextHandler = findServletContextHandler(server);
+                disableTraceMethodForHandler(servletContextHandler);
+            });
© www.soinside.com 2019 - 2024. All rights reserved.