diff --git a/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/annotation/PrincipalArgumentResolver.java b/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/annotation/PrincipalArgumentResolver.java new file mode 100644 index 00000000000..708020c57c9 --- /dev/null +++ b/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/annotation/PrincipalArgumentResolver.java @@ -0,0 +1,56 @@ +/* + * Copyright 2002-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.web.reactive.result.method.annotation; + +import java.security.Principal; + +import reactor.core.publisher.Mono; + +import org.springframework.core.MethodParameter; +import org.springframework.web.reactive.result.method.BindingContext; +import org.springframework.web.reactive.result.method.HandlerMethodArgumentResolver; +import org.springframework.web.server.ServerWebExchange; + +/** + * Resolves method argument value of type {@link java.security.Principal}. + * + * @author Rossen Stoyanchev + * @since 5.0 + * @see ServerWebExchangeArgumentResolver + */ +public class PrincipalArgumentResolver implements HandlerMethodArgumentResolver { + + @Override + public boolean supportsParameter(MethodParameter parameter) { + return (Principal.class.isAssignableFrom(parameter.getParameterType())); + } + + @Override + public Mono resolveArgument(MethodParameter parameter, BindingContext context, + ServerWebExchange exchange) { + + Class paramType = parameter.getParameterType(); + if (Principal.class.isAssignableFrom(paramType)) { + return exchange.getPrincipal().cast(Object.class); + } + else { + // should never happen... + throw new IllegalArgumentException( + "Unknown parameter type: " + paramType + " in method: " + parameter.getMethod()); + } + } + +} diff --git a/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerAdapter.java b/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerAdapter.java index 7904e4432c1..43ec18e78ec 100644 --- a/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerAdapter.java +++ b/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerAdapter.java @@ -241,6 +241,7 @@ public class RequestMappingHandlerAdapter implements HandlerAdapter, BeanFactory resolvers.add(new HttpEntityArgumentResolver(getMessageReaders(), getReactiveAdapterRegistry())); resolvers.add(new ModelArgumentResolver()); resolvers.add(new ServerWebExchangeArgumentResolver()); + resolvers.add(new PrincipalArgumentResolver()); resolvers.add(new WebSessionArgumentResolver()); // Custom resolvers diff --git a/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/annotation/ServerWebExchangeArgumentResolver.java b/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/annotation/ServerWebExchangeArgumentResolver.java index 6a47cd35df9..5634a2d8be1 100644 --- a/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/annotation/ServerWebExchangeArgumentResolver.java +++ b/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/annotation/ServerWebExchangeArgumentResolver.java @@ -30,15 +30,17 @@ import org.springframework.web.server.ServerWebExchange; * * - *

For the {@code WebSession} see {@link WebSessionArgumentResolver}. + *

For the {@code WebSession} see {@link WebSessionArgumentResolver} + * and for the {@code Principal} see {@link PrincipalArgumentResolver}. * * @author Rossen Stoyanchev * @since 5.0 * @see WebSessionArgumentResolver + * @see PrincipalArgumentResolver */ public class ServerWebExchangeArgumentResolver implements SyncHandlerMethodArgumentResolver { @@ -56,25 +58,23 @@ public class ServerWebExchangeArgumentResolver implements SyncHandlerMethodArgum ServerWebExchange exchange) { Class paramType = parameter.getParameterType(); - Object value; if (ServerWebExchange.class.isAssignableFrom(paramType)) { - value = exchange; + return Optional.of(exchange); } else if (ServerHttpRequest.class.isAssignableFrom(paramType)) { - value = exchange.getRequest(); + return Optional.of(exchange.getRequest()); } else if (ServerHttpResponse.class.isAssignableFrom(paramType)) { - value = exchange.getResponse(); + return Optional.of(exchange.getResponse()); } else if (HttpMethod.class == paramType) { - value = exchange.getRequest().getMethod(); + return Optional.of(exchange.getRequest().getMethod()); } else { // should never happen... throw new IllegalArgumentException( "Unknown parameter type: " + paramType + " in method: " + parameter.getMethod()); } - return Optional.of(value); } } diff --git a/spring-web/src/main/java/org/springframework/web/server/DefaultServerWebExchangeMutativeBuilder.java b/spring-web/src/main/java/org/springframework/web/server/DefaultServerWebExchangeMutativeBuilder.java index 8bb292927c3..b6b521e1a58 100644 --- a/spring-web/src/main/java/org/springframework/web/server/DefaultServerWebExchangeMutativeBuilder.java +++ b/spring-web/src/main/java/org/springframework/web/server/DefaultServerWebExchangeMutativeBuilder.java @@ -16,7 +16,6 @@ package org.springframework.web.server; import java.security.Principal; -import java.util.Optional; import reactor.core.publisher.Mono; @@ -40,7 +39,7 @@ class DefaultServerWebExchangeMutativeBuilder implements ServerWebExchange.Mutat private ServerHttpResponse response; - private Principal user; + private Mono user; private Mono session; @@ -66,7 +65,7 @@ class DefaultServerWebExchangeMutativeBuilder implements ServerWebExchange.Mutat } @Override - public ServerWebExchange.MutativeBuilder setPrincipal(Principal user) { + public ServerWebExchange.MutativeBuilder setPrincipal(Mono user) { this.user = user; return this; } @@ -100,7 +99,7 @@ class DefaultServerWebExchangeMutativeBuilder implements ServerWebExchange.Mutat private final ServerHttpResponse response; - private final Principal user; + private final Mono userMono; private final Mono session; @@ -108,13 +107,13 @@ class DefaultServerWebExchangeMutativeBuilder implements ServerWebExchange.Mutat public MutativeDecorator(ServerWebExchange delegate, - ServerHttpRequest request, ServerHttpResponse response, Principal user, + ServerHttpRequest request, ServerHttpResponse response, Mono user, Mono session, Mono> formData) { super(delegate); this.request = request; this.response = response; - this.user = user; + this.userMono = user; this.session = session; this.formData = formData; } @@ -137,8 +136,8 @@ class DefaultServerWebExchangeMutativeBuilder implements ServerWebExchange.Mutat @SuppressWarnings("unchecked") @Override - public Optional getPrincipal() { - return (this.user != null ? Optional.of((T) this.user) : getDelegate().getPrincipal()); + public Mono getPrincipal() { + return (this.userMono != null ? (Mono) this.userMono : getDelegate().getPrincipal()); } @Override diff --git a/spring-web/src/main/java/org/springframework/web/server/ServerWebExchange.java b/spring-web/src/main/java/org/springframework/web/server/ServerWebExchange.java index e219d8412f1..1b4e88be303 100644 --- a/spring-web/src/main/java/org/springframework/web/server/ServerWebExchange.java +++ b/spring-web/src/main/java/org/springframework/web/server/ServerWebExchange.java @@ -73,7 +73,7 @@ public interface ServerWebExchange { /** * Return the authenticated user for the request, if any. */ - Optional getPrincipal(); + Mono getPrincipal(); /** * Return the form data from the body of the request or an empty {@code Mono} @@ -155,7 +155,7 @@ public interface ServerWebExchange { /** * Set the principal to use. */ - MutativeBuilder setPrincipal(Principal user); + MutativeBuilder setPrincipal(Mono user); /** * Set the session to use. diff --git a/spring-web/src/main/java/org/springframework/web/server/ServerWebExchangeDecorator.java b/spring-web/src/main/java/org/springframework/web/server/ServerWebExchangeDecorator.java index 2dcd561ad58..2a39be8ba7b 100644 --- a/spring-web/src/main/java/org/springframework/web/server/ServerWebExchangeDecorator.java +++ b/spring-web/src/main/java/org/springframework/web/server/ServerWebExchangeDecorator.java @@ -84,7 +84,7 @@ public class ServerWebExchangeDecorator implements ServerWebExchange { } @Override - public Optional getPrincipal() { + public Mono getPrincipal() { return getDelegate().getPrincipal(); } diff --git a/spring-web/src/main/java/org/springframework/web/server/adapter/DefaultServerWebExchange.java b/spring-web/src/main/java/org/springframework/web/server/adapter/DefaultServerWebExchange.java index a7eed8018e7..84de4de80c9 100644 --- a/spring-web/src/main/java/org/springframework/web/server/adapter/DefaultServerWebExchange.java +++ b/spring-web/src/main/java/org/springframework/web/server/adapter/DefaultServerWebExchange.java @@ -135,8 +135,8 @@ public class DefaultServerWebExchange implements ServerWebExchange { } @Override - public Optional getPrincipal() { - return Optional.empty(); + public Mono getPrincipal() { + return Mono.empty(); } @Override