Skip to content

Commit cf572a9

Browse files
committed
Allow configuring custom ServerHttpHeadersWriter for Kotlin DSL
Closes gh-16009
1 parent 30c9860 commit cf572a9

File tree

2 files changed

+62
-2
lines changed

2 files changed

+62
-2
lines changed

config/src/main/kotlin/org/springframework/security/config/web/server/ServerHeadersDsl.kt

+16-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2021 the original author or authors.
2+
* Copyright 2002-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -17,6 +17,7 @@
1717
package org.springframework.security.config.web.server
1818

1919
import org.springframework.security.web.server.header.CacheControlServerHttpHeadersWriter
20+
import org.springframework.security.web.server.header.ServerHttpHeadersWriter
2021
import org.springframework.security.web.server.header.ContentTypeOptionsServerHttpHeadersWriter
2122
import org.springframework.security.web.server.header.ReferrerPolicyServerHttpHeadersWriter
2223
import org.springframework.security.web.server.header.StrictTransportSecurityServerHttpHeadersWriter
@@ -43,6 +44,7 @@ class ServerHeadersDsl {
4344
private var crossOriginOpenerPolicy: ((ServerHttpSecurity.HeaderSpec.CrossOriginOpenerPolicySpec) -> Unit)? = null
4445
private var crossOriginEmbedderPolicy: ((ServerHttpSecurity.HeaderSpec.CrossOriginEmbedderPolicySpec) -> Unit)? = null
4546
private var crossOriginResourcePolicy: ((ServerHttpSecurity.HeaderSpec.CrossOriginResourcePolicySpec) -> Unit)? = null
47+
private var writers = mutableListOf<ServerHttpHeadersWriter>()
4648

4749
private var disabled = false
4850

@@ -198,6 +200,16 @@ class ServerHeadersDsl {
198200
this.crossOriginResourcePolicy = ServerCrossOriginResourcePolicyDsl().apply(crossOriginResourcePolicyConfig).get()
199201
}
200202

203+
/**
204+
* Configures custom headers writer
205+
*
206+
* @since 6.5
207+
* @param writer the [ServerHttpHeadersWriter] to provide custom headers writer
208+
*/
209+
fun writer(writer: ServerHttpHeadersWriter) {
210+
this.writers.add(writer)
211+
}
212+
201213
/**
202214
* Disables HTTP response headers.
203215
*/
@@ -244,6 +256,9 @@ class ServerHeadersDsl {
244256
crossOriginResourcePolicy?.also {
245257
headers.crossOriginResourcePolicy(crossOriginResourcePolicy)
246258
}
259+
writers.also {
260+
writers.forEach { writer -> headers.writer(writer) }
261+
}
247262
if (disabled) {
248263
headers.disable()
249264
}

config/src/test/kotlin/org/springframework/security/config/web/server/ServerHeadersDslTests.kt

+46-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2021 the original author or authors.
2+
* Copyright 2002-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -37,6 +37,7 @@ import org.springframework.security.web.server.header.XFrameOptionsServerHttpHea
3737
import org.springframework.security.web.server.header.XXssProtectionServerHttpHeadersWriter
3838
import org.springframework.test.web.reactive.server.WebTestClient
3939
import org.springframework.web.reactive.config.EnableWebFlux
40+
import reactor.core.publisher.Mono
4041

4142
/**
4243
* Tests for [ServerHeadersDsl]
@@ -198,4 +199,48 @@ class ServerHeadersDslTests {
198199
}
199200
}
200201
}
202+
203+
@Test
204+
fun `request when custom server http headers writer configured then custom http headers added`() {
205+
this.spring.register(ServerHttpHeadersWriterCustomConfig::class.java).autowire()
206+
207+
this.client.get()
208+
.uri("/")
209+
.exchange()
210+
.expectHeader().valueEquals("CUSTOM-HEADER-1", "CUSTOM-VALUE-1")
211+
.expectHeader().valueEquals("CUSTOM-HEADER-2", "CUSTOM-VALUE-2")
212+
}
213+
214+
@Configuration
215+
@EnableWebFluxSecurity
216+
@EnableWebFlux
217+
open class ServerHttpHeadersWriterCustomConfig {
218+
@Bean
219+
open fun springWebFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain {
220+
return http {
221+
headers {
222+
writer { exchange ->
223+
Mono.just(exchange)
224+
.doOnNext {
225+
it.response.headers.add(
226+
"CUSTOM-HEADER-1",
227+
"CUSTOM-VALUE-1"
228+
)
229+
}
230+
.then()
231+
}
232+
writer { exchange ->
233+
Mono.just(exchange)
234+
.doOnNext {
235+
it.response.headers.add(
236+
"CUSTOM-HEADER-2",
237+
"CUSTOM-VALUE-2"
238+
)
239+
}
240+
.then()
241+
}
242+
}
243+
}
244+
}
245+
}
201246
}

0 commit comments

Comments
 (0)