16
16
17
17
package org.springframework.security.config.web.servlet
18
18
19
+ import io.mockk.every
20
+ import io.mockk.mockkObject
21
+ import io.mockk.verify
19
22
import org.junit.jupiter.api.Test
20
23
import org.junit.jupiter.api.extension.ExtendWith
21
24
import org.springframework.beans.factory.annotation.Autowired
22
25
import org.springframework.context.annotation.Bean
23
26
import org.springframework.context.annotation.Configuration
27
+ import org.springframework.security.authentication.AuthenticationDetailsSource
24
28
import org.springframework.security.config.annotation.web.builders.HttpSecurity
25
29
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
26
30
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter
@@ -29,10 +33,16 @@ import org.springframework.security.config.test.SpringTestContext
29
33
import org.springframework.security.config.test.SpringTestContextExtension
30
34
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository
31
35
import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository
36
+ import org.springframework.security.oauth2.client.web.HttpSessionOAuth2AuthorizationRequestRepository
37
+ import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest
38
+ import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames
39
+ import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf
32
40
import org.springframework.test.web.servlet.MockMvc
33
41
import org.springframework.test.web.servlet.get
42
+ import org.springframework.test.web.servlet.post
34
43
import org.springframework.web.bind.annotation.GetMapping
35
44
import org.springframework.web.bind.annotation.RestController
45
+ import javax.servlet.http.HttpServletRequest
36
46
37
47
/* *
38
48
* Tests for [OAuth2LoginDsl]
@@ -113,6 +123,58 @@ class OAuth2LoginDslTests {
113
123
}
114
124
}
115
125
126
+ @Test
127
+ fun `oauth2Login when custom authentication details source then used` () {
128
+ this .spring
129
+ .register(CustomAuthenticationDetailsSourceConfig ::class .java, ClientConfig ::class .java)
130
+ .autowire()
131
+ mockkObject(CustomAuthenticationDetailsSourceConfig .AUTHENTICATION_DETAILS_SOURCE )
132
+ every {
133
+ CustomAuthenticationDetailsSourceConfig .AUTHENTICATION_DETAILS_SOURCE .buildDetails(any())
134
+ } returns Any ()
135
+ mockkObject(CustomAuthenticationDetailsSourceConfig .AUTHORIZATION_REQUEST_REPOSITORY )
136
+ every {
137
+ CustomAuthenticationDetailsSourceConfig .AUTHORIZATION_REQUEST_REPOSITORY .removeAuthorizationRequest(any(), any())
138
+ } returns OAuth2AuthorizationRequest .authorizationCode()
139
+ .authorizationUri(" /" )
140
+ .clientId(" clientId" )
141
+ .redirectUri(" /" )
142
+ .attributes { attributes -> attributes[OAuth2ParameterNames .REGISTRATION_ID ] = " google" }
143
+ .build()
144
+
145
+ this .mockMvc.post(" /login/oauth2/code/google" ) {
146
+ param(OAuth2ParameterNames .CODE , " code" )
147
+ param(OAuth2ParameterNames .STATE , " state" )
148
+ with (csrf())
149
+ }
150
+ .andExpect {
151
+ status { is3xxRedirection() }
152
+ }
153
+
154
+ verify(exactly = 1 ) { CustomAuthenticationDetailsSourceConfig .AUTHENTICATION_DETAILS_SOURCE .buildDetails(any()) }
155
+ }
156
+
157
+ @EnableWebSecurity
158
+ open class CustomAuthenticationDetailsSourceConfig : WebSecurityConfigurerAdapter () {
159
+
160
+ companion object {
161
+ val AUTHENTICATION_DETAILS_SOURCE : AuthenticationDetailsSource <HttpServletRequest , * > =
162
+ AuthenticationDetailsSource <HttpServletRequest , Any > { Any () }
163
+ val AUTHORIZATION_REQUEST_REPOSITORY = HttpSessionOAuth2AuthorizationRequestRepository ()
164
+ }
165
+
166
+ override fun configure (http : HttpSecurity ) {
167
+ http {
168
+ oauth2Login {
169
+ authenticationDetailsSource = AUTHENTICATION_DETAILS_SOURCE
170
+ authorizationEndpoint {
171
+ authorizationRequestRepository = AUTHORIZATION_REQUEST_REPOSITORY
172
+ }
173
+ }
174
+ }
175
+ }
176
+ }
177
+
116
178
@Configuration
117
179
open class ClientConfig {
118
180
@Bean
0 commit comments