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.
1616
1717package org.springframework.security.config.annotation.web
1818
19+ import org.hamcrest.Matchers
1920import org.junit.jupiter.api.Test
2021import org.junit.jupiter.api.extension.ExtendWith
2122import org.springframework.beans.factory.annotation.Autowired
@@ -30,7 +31,9 @@ import org.springframework.security.core.userdetails.UserDetailsService
3031import org.springframework.security.provisioning.InMemoryUserDetailsManager
3132import org.springframework.security.web.SecurityFilterChain
3233import org.springframework.test.web.servlet.MockMvc
34+ import org.springframework.test.web.servlet.get
3335import org.springframework.test.web.servlet.post
36+ import org.springframework.test.web.servlet.result.MockMvcResultMatchers
3437
3538/* *
3639 * Tests for [WebAuthnDsl]
@@ -55,6 +58,76 @@ 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+ @Test
78+ fun `webauthn and formLogin configured with disabled default registration page` () {
79+ spring.register(FormLoginAndNoDefaultRegistrationPageConfiguration ::class .java).autowire()
80+
81+ this .mockMvc.get(" /login/webauthn.js" )
82+ .andExpect {
83+ MockMvcResultMatchers .status().isOk
84+ header {
85+ string(" content-type" , " text/javascript;charset=UTF-8" )
86+ }
87+ content {
88+ string(Matchers .containsString(" async function authenticate(" ))
89+ }
90+ }
91+ }
92+
93+ @Configuration
94+ @EnableWebSecurity
95+ open class FormLoginAndNoDefaultRegistrationPageConfiguration {
96+ @Bean
97+ open fun userDetailsService (): UserDetailsService =
98+ InMemoryUserDetailsManager ()
99+
100+
101+ @Bean
102+ open fun securityFilterChain (http : HttpSecurity ): SecurityFilterChain {
103+ http{
104+ formLogin { }
105+ webAuthn {
106+ disableDefaultRegistrationPage = true
107+ }
108+ }
109+ return http.build()
110+ }
111+ }
112+
113+ @Configuration
114+ @EnableWebSecurity
115+ open class DefaultWebauthnConfig {
116+ @Bean
117+ open fun userDetailsService (): UserDetailsService =
118+ InMemoryUserDetailsManager ()
119+
120+
121+ @Bean
122+ open fun securityFilterChain (http : HttpSecurity ): SecurityFilterChain {
123+ http{
124+ formLogin { }
125+ webAuthn { }
126+ }
127+ return http.build()
128+ }
129+ }
130+
58131 @Configuration
59132 @EnableWebSecurity
60133 open class WebauthnConfig {
0 commit comments