Skip to content

Commit 459b872

Browse files
committed
Cleanup Kotlin AuthorizationManagerFactory Generics
This cleans up the generic types within the Kotlin DSL that reference AuthorizationManagerFactory Issue spring-projectsgh-17860
1 parent 628f3da commit 459b872

File tree

2 files changed

+58
-8
lines changed

2 files changed

+58
-8
lines changed

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

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -274,22 +274,22 @@ class AuthorizeHttpRequestsDsl : AbstractRequestMatcherDsl {
274274
}
275275

276276
constructor(context: ApplicationContext) {
277-
this.authorizationManagerFactory = resolveAuthorizationManagerFactory(context)
277+
this.authorizationManagerFactory = resolveAuthorizationManagerFactory(context)
278278
this.authenticated = this.authorizationManagerFactory.authenticated()
279279
this.denyAll = this.authorizationManagerFactory.denyAll()
280280
this.fullyAuthenticated = this.authorizationManagerFactory.fullyAuthenticated()
281281
this.permitAll = this.authorizationManagerFactory.permitAll()
282282
}
283283

284284
private fun resolveAuthorizationManagerFactory(context: ApplicationContext): AuthorizationManagerFactory<in RequestAuthorizationContext> {
285-
val specific = context.getBeanProvider<AuthorizationManagerFactory<RequestAuthorizationContext>>().getIfUnique()
286-
if (specific != null) {
287-
return specific
285+
val factoryOfRequestAuthorizationContext = context.getBeanProvider<AuthorizationManagerFactory<RequestAuthorizationContext>>().getIfUnique()
286+
if (factoryOfRequestAuthorizationContext != null) {
287+
return factoryOfRequestAuthorizationContext
288288
}
289-
val type = ResolvableType.forClassWithGenerics(AuthorizationManagerFactory::class.java, Object::class.java)
290-
val general: AuthorizationManagerFactory<in RequestAuthorizationContext>? = context.getBeanProvider<AuthorizationManagerFactory<in RequestAuthorizationContext>>(type).getIfUnique()
291-
if (general != null) {
292-
return general
289+
val factoryOfObjectType = ResolvableType.forClassWithGenerics(AuthorizationManagerFactory::class.java, Object::class.java)
290+
val factoryOfAny = context.getBeanProvider<AuthorizationManagerFactory<Any>>(factoryOfObjectType).getIfUnique()
291+
if (factoryOfAny != null) {
292+
return factoryOfAny
293293
}
294294
val defaultFactory: DefaultAuthorizationManagerFactory<RequestAuthorizationContext> = DefaultAuthorizationManagerFactory()
295295
val rolePrefix = resolveRolePrefix(context)
@@ -318,4 +318,5 @@ class AuthorizeHttpRequestsDsl : AbstractRequestMatcherDsl {
318318
}
319319
return NullRoleHierarchy()
320320
}
321+
321322
}

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

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,12 @@
1616

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

19+
import io.mockk.Called
1920
import io.mockk.every
2021
import io.mockk.mockk
2122
import io.mockk.verify
2223
import jakarta.servlet.DispatcherType
24+
import org.aopalliance.intercept.MethodInvocation
2325
import org.assertj.core.api.Assertions.assertThatThrownBy
2426
import org.junit.jupiter.api.Test
2527
import org.junit.jupiter.api.extension.ExtendWith
@@ -1120,4 +1122,51 @@ class AuthorizeHttpRequestsDslTests {
11201122
}
11211123
}
11221124
}
1125+
1126+
@Test
1127+
fun `custom AuthorizationManagerFactory of MethodInvocation`() {
1128+
this.spring.register(AuthorizationManagerFactoryMethodInvocationConfig::class.java).autowire()
1129+
val authzManagerFactory =
1130+
this.spring.context.getBean<AuthorizationManagerFactory<MethodInvocation>>()
1131+
1132+
verify(exactly = 0) { authzManagerFactory.authenticated() }
1133+
}
1134+
1135+
@Configuration
1136+
@EnableWebSecurity
1137+
@EnableWebMvc
1138+
open class AuthorizationManagerFactoryMethodInvocationConfig {
1139+
val authorizationManager: AuthorizationManager<MethodInvocation> = mockk()
1140+
1141+
@Bean
1142+
open fun securityFilterChain(http: HttpSecurity): SecurityFilterChain {
1143+
http {
1144+
authorizeHttpRequests {
1145+
authorize("/authenticated", authenticated)
1146+
}
1147+
httpBasic { }
1148+
rememberMe { }
1149+
}
1150+
return http.build()
1151+
}
1152+
1153+
@Bean
1154+
open fun authorizationManagerFactory(): AuthorizationManagerFactory<MethodInvocation> {
1155+
val factory: AuthorizationManagerFactory<MethodInvocation> = mockk()
1156+
every { factory.authenticated() } returns this.authorizationManager
1157+
1158+
return factory
1159+
}
1160+
1161+
@Bean
1162+
open fun userDetailsService(): UserDetailsService = InMemoryUserDetailsManager(TestAuthentication.user())
1163+
1164+
@RestController
1165+
internal class OkController {
1166+
@GetMapping("/**")
1167+
fun ok(): String {
1168+
return "ok"
1169+
}
1170+
}
1171+
}
11231172
}

0 commit comments

Comments
 (0)