Skip to content

Commit 882766e

Browse files
franticticktickrwinch
authored andcommitted
Fix Kotlin webAuthn {}
Fixes the default configuration for WebAuthn Kotlin DSL Closes gh-16338 Signed-off-by: Max Batischev <[email protected]>
1 parent d457e0b commit 882766e

File tree

2 files changed

+44
-6
lines changed
  • config/src

2 files changed

+44
-6
lines changed

config/src/main/kotlin/org/springframework/security/config/annotation/web/WebAuthnDsl.kt

Lines changed: 6 additions & 5 deletions
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-2025 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.
@@ -26,6 +26,7 @@ import org.springframework.security.config.annotation.web.configurers.WebAuthnCo
2626
* @property the allowed origins
2727
* @since 6.4
2828
* @author Rob Winch
29+
* @author Max Batischev
2930
*/
3031
@SecurityMarker
3132
class WebAuthnDsl {
@@ -34,10 +35,10 @@ class WebAuthnDsl {
3435
var allowedOrigins: Set<String>? = null
3536

3637
internal fun get(): (WebAuthnConfigurer<HttpSecurity>) -> Unit {
37-
return { webAuthn -> webAuthn
38-
.rpId(rpId)
39-
.rpName(rpName)
40-
.allowedOrigins(allowedOrigins);
38+
return { webAuthn ->
39+
rpName?.also { webAuthn.rpName(rpName) }
40+
rpId?.also { webAuthn.rpId(rpId) }
41+
allowedOrigins?.also { webAuthn.allowedOrigins(allowedOrigins) }
4142
}
4243
}
4344
}

config/src/test/kotlin/org/springframework/security/config/annotation/web/WebAuthnDslTests.kt

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2022 the original author or authors.
2+
* Copyright 2002-2025 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.
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.security.config.annotation.web
1818

19+
import org.hamcrest.Matchers
1920
import org.junit.jupiter.api.Test
2021
import org.junit.jupiter.api.extension.ExtendWith
2122
import org.springframework.beans.factory.annotation.Autowired
@@ -30,7 +31,9 @@ import org.springframework.security.core.userdetails.UserDetailsService
3031
import org.springframework.security.provisioning.InMemoryUserDetailsManager
3132
import org.springframework.security.web.SecurityFilterChain
3233
import org.springframework.test.web.servlet.MockMvc
34+
import org.springframework.test.web.servlet.get
3335
import org.springframework.test.web.servlet.post
36+
import org.springframework.test.web.servlet.result.MockMvcResultMatchers
3437

3538
/**
3639
* Tests for [WebAuthnDsl]
@@ -55,6 +58,40 @@ class WebAuthnDslTests {
5558
}
5659
}
5760

61+
@Test
62+
fun `webauthn and formLogin configured with default registration page`() {
63+
spring.register(DefaultWebauthnConfig::class.java).autowire()
64+
65+
this.mockMvc.get("/login/webauthn.js")
66+
.andExpect {
67+
MockMvcResultMatchers.status().isOk
68+
header {
69+
string("content-type", "text/javascript;charset=UTF-8")
70+
}
71+
content {
72+
string(Matchers.containsString("async function authenticate("))
73+
}
74+
}
75+
}
76+
77+
@Configuration
78+
@EnableWebSecurity
79+
open class DefaultWebauthnConfig {
80+
@Bean
81+
open fun userDetailsService(): UserDetailsService =
82+
InMemoryUserDetailsManager()
83+
84+
85+
@Bean
86+
open fun securityFilterChain(http: HttpSecurity): SecurityFilterChain {
87+
http{
88+
formLogin { }
89+
webAuthn { }
90+
}
91+
return http.build()
92+
}
93+
}
94+
5895
@Configuration
5996
@EnableWebSecurity
6097
open class WebauthnConfig {

0 commit comments

Comments
 (0)