Use ReactorSecurityContextHolder
Issue gh-4713
This commit is contained in:
+10
-1
@@ -17,6 +17,8 @@
|
||||
package org.springframework.security.web.server.context;
|
||||
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.security.core.context.ReactiveSecurityContextHolder;
|
||||
import org.springframework.security.core.context.SecurityContextImpl;
|
||||
import org.springframework.web.server.ServerWebExchange;
|
||||
import org.springframework.web.server.WebFilter;
|
||||
import org.springframework.web.server.WebFilterChain;
|
||||
@@ -38,6 +40,13 @@ public class AuthenticationReactorContextWebFilter implements WebFilter {
|
||||
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
|
||||
|
||||
return chain.filter(exchange)
|
||||
.subscriberContext((Context context) -> context.put(Authentication.class, exchange.getPrincipal()));
|
||||
.subscriberContext(createContext(exchange));
|
||||
}
|
||||
|
||||
private Context createContext(ServerWebExchange exchange) {
|
||||
return exchange.getPrincipal()
|
||||
.cast(Authentication.class)
|
||||
.map(SecurityContextImpl::new)
|
||||
.as(ReactiveSecurityContextHolder::withSecurityContext);
|
||||
}
|
||||
}
|
||||
|
||||
+18
-19
@@ -21,11 +21,12 @@ import org.springframework.mock.http.server.reactive.MockServerHttpRequest;
|
||||
import org.springframework.mock.web.server.MockServerWebExchange;
|
||||
import org.springframework.security.authentication.TestingAuthenticationToken;
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.security.core.context.ReactiveSecurityContextHolder;
|
||||
import org.springframework.security.core.context.SecurityContext;
|
||||
import org.springframework.web.server.ServerWebExchange;
|
||||
import org.springframework.web.server.handler.DefaultWebFilterChain;
|
||||
import reactor.core.publisher.Mono;
|
||||
import reactor.test.StepVerifier;
|
||||
import reactor.util.context.Context;
|
||||
|
||||
import java.security.Principal;
|
||||
|
||||
@@ -47,12 +48,12 @@ public class AuthenticationReactorContextWebFilterTests {
|
||||
exchange = exchange.mutate().principal(Mono.just(principal)).build();
|
||||
StepVerifier.create(filter.filter(exchange,
|
||||
new DefaultWebFilterChain( e ->
|
||||
Mono.subscriberContext().doOnSuccess( context -> {
|
||||
Principal contextPrincipal = context.<Mono<Principal>>get(Authentication.class).block();
|
||||
assertThat(contextPrincipal).isEqualTo(principal);
|
||||
assertThat(context.<String>get("foo")).isEqualTo("bar");
|
||||
})
|
||||
.then()
|
||||
ReactiveSecurityContextHolder.getContext()
|
||||
.map(SecurityContext::getAuthentication)
|
||||
.doOnSuccess(contextPrincipal -> assertThat(contextPrincipal).isEqualTo(principal))
|
||||
.flatMap( contextPrincipal -> Mono.subscriberContext())
|
||||
.doOnSuccess( context -> assertThat(context.<String>get("foo")).isEqualTo("bar"))
|
||||
.then()
|
||||
)
|
||||
)
|
||||
.subscriberContext( context -> context.put("foo", "bar")))
|
||||
@@ -64,11 +65,10 @@ public class AuthenticationReactorContextWebFilterTests {
|
||||
exchange = exchange.mutate().principal(Mono.just(principal)).build();
|
||||
StepVerifier.create(filter.filter(exchange,
|
||||
new DefaultWebFilterChain( e ->
|
||||
Mono.subscriberContext().doOnSuccess( context -> {
|
||||
Principal contextPrincipal = context.<Mono<Principal>>get(Authentication.class).block();
|
||||
assertThat(contextPrincipal).isEqualTo(principal);
|
||||
})
|
||||
.then()
|
||||
ReactiveSecurityContextHolder.getContext()
|
||||
.map(SecurityContext::getAuthentication)
|
||||
.doOnSuccess(contextPrincipal -> assertThat(contextPrincipal).isEqualTo(principal))
|
||||
.then()
|
||||
)
|
||||
))
|
||||
.verifyComplete();
|
||||
@@ -76,15 +76,14 @@ public class AuthenticationReactorContextWebFilterTests {
|
||||
|
||||
@Test
|
||||
public void filterWhenPrincipalNullThenContextEmpty() {
|
||||
Context defaultContext = Context.empty();
|
||||
Authentication defaultAuthentication = new TestingAuthenticationToken("anonymouse","anonymous", "TEST");
|
||||
StepVerifier.create(filter.filter(exchange,
|
||||
new DefaultWebFilterChain( e ->
|
||||
Mono.subscriberContext()
|
||||
.defaultIfEmpty(defaultContext)
|
||||
.doOnSuccess( context -> {
|
||||
Principal contextPrincipal = context.<Mono<Principal>>get(Authentication.class).block();
|
||||
assertThat(contextPrincipal).isNull();
|
||||
})
|
||||
ReactiveSecurityContextHolder.getContext()
|
||||
.map(SecurityContext::getAuthentication)
|
||||
.defaultIfEmpty(defaultAuthentication)
|
||||
.doOnSuccess( contextPrincipal -> assertThat(contextPrincipal).isEqualTo(defaultAuthentication)
|
||||
)
|
||||
.then()
|
||||
)
|
||||
))
|
||||
|
||||
Reference in New Issue
Block a user