Skip to content

Commit 902fca6

Browse files
committed
Add authenticationManagerResolver to Kotlin DSL
Closes gh-8981
1 parent 7a5d9ce commit 902fca6

File tree

2 files changed

+73
-5
lines changed

2 files changed

+73
-5
lines changed

config/src/main/kotlin/org/springframework/security/config/web/servlet/OAuth2ResourceServerDsl.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
1616

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

19+
import org.springframework.security.authentication.AuthenticationManagerResolver
1920
import org.springframework.security.config.annotation.web.builders.HttpSecurity
2021
import org.springframework.security.config.web.servlet.oauth2.resourceserver.JwtDsl
2122
import org.springframework.security.config.web.servlet.oauth2.resourceserver.OpaqueTokenDsl
2223
import org.springframework.security.config.annotation.web.configurers.oauth2.server.resource.OAuth2ResourceServerConfigurer
2324
import org.springframework.security.oauth2.server.resource.web.BearerTokenResolver
2425
import org.springframework.security.web.AuthenticationEntryPoint
2526
import org.springframework.security.web.access.AccessDeniedHandler
27+
import javax.servlet.http.HttpServletRequest
2628

2729
/**
2830
* A Kotlin DSL to configure [HttpSecurity] OAuth 2.0 resource server support using
@@ -42,6 +44,7 @@ class OAuth2ResourceServerDsl {
4244
var accessDeniedHandler: AccessDeniedHandler? = null
4345
var authenticationEntryPoint: AuthenticationEntryPoint? = null
4446
var bearerTokenResolver: BearerTokenResolver? = null
47+
var authenticationManagerResolver: AuthenticationManagerResolver<HttpServletRequest>? = null
4548

4649
private var jwt: ((OAuth2ResourceServerConfigurer<HttpSecurity>.JwtConfigurer) -> Unit)? = null
4750
private var opaqueToken: ((OAuth2ResourceServerConfigurer<HttpSecurity>.OpaqueTokenConfigurer) -> Unit)? = null
@@ -105,6 +108,7 @@ class OAuth2ResourceServerDsl {
105108
accessDeniedHandler?.also { oauth2ResourceServer.accessDeniedHandler(accessDeniedHandler) }
106109
authenticationEntryPoint?.also { oauth2ResourceServer.authenticationEntryPoint(authenticationEntryPoint) }
107110
bearerTokenResolver?.also { oauth2ResourceServer.bearerTokenResolver(bearerTokenResolver) }
111+
authenticationManagerResolver?.also { oauth2ResourceServer.authenticationManagerResolver(authenticationManagerResolver) }
108112
jwt?.also { oauth2ResourceServer.jwt(jwt) }
109113
opaqueToken?.also { oauth2ResourceServer.opaqueToken(opaqueToken) }
110114
}

config/src/test/kotlin/org/springframework/security/config/web/servlet/OAuth2ResourceServerDslTests.kt

Lines changed: 69 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,29 @@
1616

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

19+
import org.assertj.core.api.Assertions
1920
import org.junit.Rule
2021
import org.junit.Test
2122
import org.mockito.Mockito.*
23+
import org.springframework.beans.factory.BeanCreationException
2224
import org.springframework.beans.factory.annotation.Autowired
2325
import org.springframework.context.annotation.Bean
26+
import org.springframework.security.authentication.AuthenticationManager
27+
import org.springframework.security.authentication.AuthenticationManagerResolver
2428
import org.springframework.security.config.annotation.web.builders.HttpSecurity
2529
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
2630
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter
2731
import org.springframework.security.config.test.SpringTestRule
2832
import org.springframework.security.oauth2.core.oidc.IdTokenClaimNames.SUB
2933
import org.springframework.security.oauth2.jwt.Jwt
3034
import org.springframework.security.oauth2.jwt.JwtDecoder
35+
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken
3136
import org.springframework.security.oauth2.server.resource.web.BearerTokenResolver
3237
import org.springframework.security.web.AuthenticationEntryPoint
3338
import org.springframework.security.web.access.AccessDeniedHandler
3439
import org.springframework.test.web.servlet.MockMvc
3540
import org.springframework.test.web.servlet.get
41+
import javax.servlet.http.HttpServletRequest
3642

3743
/**
3844
* Tests for [OAuth2ResourceServerDsl]
@@ -47,6 +53,11 @@ class OAuth2ResourceServerDslTests {
4753
@Autowired
4854
lateinit var mockMvc: MockMvc
4955

56+
private val JWT: Jwt = Jwt.withTokenValue("token")
57+
.header("alg", "none")
58+
.claim(SUB, "user")
59+
.build()
60+
5061
@Test
5162
fun `oauth2Resource server when custom entry point then entry point used`() {
5263
this.spring.register(EntryPointConfig::class.java).autowire()
@@ -116,11 +127,7 @@ class OAuth2ResourceServerDslTests {
116127
@Test
117128
fun `oauth2Resource server when custom access denied handler then handler used`() {
118129
this.spring.register(AccessDeniedHandlerConfig::class.java).autowire()
119-
`when`(AccessDeniedHandlerConfig.DECODER.decode(anyString())).thenReturn(
120-
Jwt.withTokenValue("token")
121-
.header("alg", "none")
122-
.claim(SUB, "user")
123-
.build())
130+
`when`(AccessDeniedHandlerConfig.DECODER.decode(anyString())).thenReturn(JWT)
124131

125132
this.mockMvc.get("/") {
126133
header("Authorization", "Bearer token")
@@ -153,4 +160,61 @@ class OAuth2ResourceServerDslTests {
153160
return DECODER
154161
}
155162
}
163+
164+
@Test
165+
fun `oauth2Resource server when custom authentication manager resolver then resolver used`() {
166+
this.spring.register(AuthenticationManagerResolverConfig::class.java).autowire()
167+
`when`(AuthenticationManagerResolverConfig.RESOLVER.resolve(any())).thenReturn(
168+
AuthenticationManager {
169+
JwtAuthenticationToken(JWT)
170+
}
171+
)
172+
173+
this.mockMvc.get("/") {
174+
header("Authorization", "Bearer token")
175+
}
176+
177+
verify(AuthenticationManagerResolverConfig.RESOLVER).resolve(any())
178+
}
179+
180+
@EnableWebSecurity
181+
open class AuthenticationManagerResolverConfig : WebSecurityConfigurerAdapter() {
182+
companion object {
183+
var RESOLVER: AuthenticationManagerResolver<*> = mock(AuthenticationManagerResolver::class.java)
184+
}
185+
186+
override fun configure(http: HttpSecurity) {
187+
http {
188+
authorizeRequests {
189+
authorize(anyRequest, authenticated)
190+
}
191+
oauth2ResourceServer {
192+
authenticationManagerResolver = RESOLVER as AuthenticationManagerResolver<HttpServletRequest>
193+
}
194+
}
195+
}
196+
}
197+
198+
@Test
199+
fun `oauth2Resource server when custom authentication manager resolver and opaque then exception`() {
200+
Assertions.assertThatExceptionOfType(BeanCreationException::class.java)
201+
.isThrownBy { spring.register(AuthenticationManagerResolverAndOpaqueConfig::class.java).autowire() }
202+
.withMessageContaining("authenticationManagerResolver")
203+
}
204+
205+
@EnableWebSecurity
206+
open class AuthenticationManagerResolverAndOpaqueConfig : WebSecurityConfigurerAdapter() {
207+
override fun configure(http: HttpSecurity) {
208+
http {
209+
authorizeRequests {
210+
authorize(anyRequest, authenticated)
211+
}
212+
oauth2ResourceServer {
213+
authenticationManagerResolver = mock(AuthenticationManagerResolver::class.java)
214+
as AuthenticationManagerResolver<HttpServletRequest>
215+
opaqueToken { }
216+
}
217+
}
218+
}
219+
}
156220
}

0 commit comments

Comments
 (0)