11/*
2- * Copyright 2002-2022 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.
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]
@@ -80,4 +83,74 @@ class WebAuthnDslTests {
8083 return InMemoryUserDetailsManager (userDetails)
8184 }
8285 }
86+
87+ @Test
88+ fun `webauthn and formLogin configured with default registration page` () {
89+ spring.register(DefaultWebauthnConfig ::class .java).autowire()
90+
91+ this .mockMvc.get(" /login/webauthn.js" )
92+ .andExpect {
93+ MockMvcResultMatchers .status().isOk
94+ header {
95+ string(" content-type" , " text/javascript;charset=UTF-8" )
96+ }
97+ content {
98+ string(Matchers .containsString(" async function authenticate(" ))
99+ }
100+ }
101+ }
102+
103+ @Test
104+ fun `webauthn and formLogin configured with disabled default registration page` () {
105+ spring.register(FormLoginAndNoDefaultRegistrationPageConfiguration ::class .java).autowire()
106+
107+ this .mockMvc.get(" /login/webauthn.js" )
108+ .andExpect {
109+ MockMvcResultMatchers .status().isOk
110+ header {
111+ string(" content-type" , " text/javascript;charset=UTF-8" )
112+ }
113+ content {
114+ string(Matchers .containsString(" async function authenticate(" ))
115+ }
116+ }
117+ }
118+
119+ @Configuration
120+ @EnableWebSecurity
121+ open class DefaultWebauthnConfig {
122+ @Bean
123+ open fun userDetailsService (): UserDetailsService =
124+ InMemoryUserDetailsManager ()
125+
126+
127+ @Bean
128+ open fun securityFilterChain (http : HttpSecurity ): SecurityFilterChain {
129+ http{
130+ formLogin { }
131+ webAuthn { }
132+ }
133+ return http.build()
134+ }
135+ }
136+
137+ @Configuration
138+ @EnableWebSecurity
139+ open class FormLoginAndNoDefaultRegistrationPageConfiguration {
140+ @Bean
141+ open fun userDetailsService (): UserDetailsService =
142+ InMemoryUserDetailsManager ()
143+
144+
145+ @Bean
146+ open fun securityFilterChain (http : HttpSecurity ): SecurityFilterChain {
147+ http{
148+ formLogin { }
149+ webAuthn {
150+ disableDefaultRegistrationPage = true
151+ }
152+ }
153+ return http.build()
154+ }
155+ }
83156}
0 commit comments