Open
Description
I would like to have option to pass SecurityContextHolder.createEmptyContext()
into my reactor test
Expected Behavior
Test passed
@ExtendWith(SpringExtension::class)
@TestExecutionListeners(
WithSecurityContextTestExecutionListener::class,
ReactorContextTestExecutionListener::class
)
internal class SpringSecurityIdentityProviderTest {
@Test
@WithEmptySecurityContext
fun `when security context is empty then context should be passed to test`() {
Mono.defer {
ReactiveSecurityContextHolder.getContext()
.onEmptyError { IllegalStateException("Require security context") }
.filter { it.authentication == null }
}.onEmptyError { IllegalStateException("Require security context with Empty auth") }
.block()
}
}
class EmptySecurityContextFactory : WithSecurityContextFactory<WithEmptySecurityContext> {
override fun createSecurityContext(annotation: WithEmptySecurityContext?): SecurityContext {
return SecurityContextHolder.createEmptyContext()
}
}
@WithSecurityContext(factory = EmptySecurityContextFactory::class)
annotation class WithEmptySecurityContext
Current Behavior
test failed
Context
Sometime we receive empty SecurityContext in our logic and would like to have option to test these cases.
But ReactorContextTestExecutionListener do not pass empty SecurityContext to tests.
Workaround is to modify stream context like this:
Mono.defer {
ReactiveSecurityContextHolder.getContext()
.onEmptyError { IllegalStateException("Require security context") }
.filter { it.authentication == null }
}.onEmptyError { IllegalStateException("Require security context with Empty auth") }
.contextWrite({
val withSecurityContext = ReactiveSecurityContextHolder.withSecurityContext(
Mono.just(SecurityContextHolder.createEmptyContext())
)
withSecurityContext.putAll(it.readOnly())
withSecurityContext
})
.block()