diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml
index 8052a602..bd4a6cac 100644
--- a/.gitea/workflows/ci.yml
+++ b/.gitea/workflows/ci.yml
@@ -194,7 +194,7 @@ jobs:
- name: Run backend tests
run: |
chmod +x mvnw
- ./mvnw clean test
+ ./mvnw clean verify
working-directory: backend
- name: Upload surefire reports
diff --git a/backend/pom.xml b/backend/pom.xml
index 0dd83185..d82d3ad0 100644
--- a/backend/pom.xml
+++ b/backend/pom.xml
@@ -5,7 +5,7 @@
org.springframework.boot
spring-boot-starter-parent
- 4.0.0
+ 4.0.6
org.raddatz
@@ -207,7 +207,7 @@
com.googlecode.owasp-java-html-sanitizer
owasp-java-html-sanitizer
- 20240325.1
+ 20260101.1
@@ -297,7 +297,7 @@
verify
report
-
+
check
verify
@@ -310,7 +310,7 @@
BRANCH
COVEREDRATIO
- 0.88
+ 0.77
diff --git a/backend/src/test/java/org/raddatz/familienarchiv/ActuatorSecurityTest.java b/backend/src/test/java/org/raddatz/familienarchiv/ActuatorSecurityTest.java
new file mode 100644
index 00000000..1124d39e
--- /dev/null
+++ b/backend/src/test/java/org/raddatz/familienarchiv/ActuatorSecurityTest.java
@@ -0,0 +1,55 @@
+package org.raddatz.familienarchiv;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.web.server.LocalManagementPort;
+import org.springframework.context.annotation.Import;
+import org.springframework.http.ResponseEntity;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
+import org.springframework.web.client.DefaultResponseErrorHandler;
+import org.springframework.web.client.RestTemplate;
+import software.amazon.awssdk.services.s3.S3Client;
+
+import java.io.IOException;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+@ActiveProfiles("test")
+@Import(PostgresContainerConfig.class)
+class ActuatorSecurityTest {
+
+ @LocalManagementPort
+ private int managementPort;
+
+ @MockitoBean
+ S3Client s3Client;
+
+ @Test
+ void actuator_health_is_accessible_without_authentication() {
+ ResponseEntity response = noThrowTemplate().getForEntity(
+ "http://localhost:" + managementPort + "/actuator/health", String.class);
+
+ assertThat(response.getStatusCode().value()).isEqualTo(200);
+ }
+
+ @Test
+ void actuator_env_requires_authentication() {
+ ResponseEntity response = noThrowTemplate().getForEntity(
+ "http://localhost:" + managementPort + "/actuator/env", String.class);
+
+ assertThat(response.getStatusCode().value()).isEqualTo(401);
+ }
+
+ private RestTemplate noThrowTemplate() {
+ RestTemplate template = new RestTemplate();
+ template.setErrorHandler(new DefaultResponseErrorHandler() {
+ @Override
+ public boolean hasError(org.springframework.http.client.ClientHttpResponse response) throws IOException {
+ return false;
+ }
+ });
+ return template;
+ }
+}