|
@@ -0,0 +1,192 @@
|
|
|
+/*
|
|
|
+ *
|
|
|
+ * * Copyright 2002-2017 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.security.test.web.reactive.server;
|
|
|
+
|
|
|
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
|
|
+import org.springframework.security.core.Authentication;
|
|
|
+import org.springframework.security.core.GrantedAuthority;
|
|
|
+import org.springframework.security.core.userdetails.User;
|
|
|
+import org.springframework.security.core.userdetails.UserDetails;
|
|
|
+import org.springframework.web.server.ServerWebExchange;
|
|
|
+import reactor.core.publisher.Mono;
|
|
|
+
|
|
|
+import java.security.Principal;
|
|
|
+import java.util.Collection;
|
|
|
+import java.util.function.UnaryOperator;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Test utilities for working with Spring Security and
|
|
|
+ * {{@link org.springframework.test.web.reactive.server.WebTestClient#exchangeMutator(UnaryOperator)}}.
|
|
|
+ *
|
|
|
+ * @author Rob Winch
|
|
|
+ * @since 5.0
|
|
|
+ */
|
|
|
+public class SecurityExchangeMutators {
|
|
|
+ /**
|
|
|
+ * Updates the ServerWebExchange to use the provided Principal
|
|
|
+ *
|
|
|
+ * @param principal the principal to use.
|
|
|
+ * @return the {@link UnaryOperator<ServerWebExchange>}} to provide to
|
|
|
+ * {@link org.springframework.test.web.reactive.server.WebTestClient#exchangeMutator(UnaryOperator)}
|
|
|
+ */
|
|
|
+ public static UnaryOperator<ServerWebExchange> withPrincipal(Principal principal) {
|
|
|
+ return m -> m.mutate().principal(Mono.just(principal)).build();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Updates the ServerWebExchange to use the provided Authentication as the Principal
|
|
|
+ *
|
|
|
+ * @param authentication the Authentication to use.
|
|
|
+ * @return the {@link UnaryOperator<ServerWebExchange>}} to provide to
|
|
|
+ * {@link org.springframework.test.web.reactive.server.WebTestClient#exchangeMutator(UnaryOperator)}
|
|
|
+ */
|
|
|
+ public static UnaryOperator<ServerWebExchange> withAuthentication(Authentication authentication) {
|
|
|
+ return withPrincipal(authentication);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Updates the ServerWebExchange to use the provided UserDetails to create a UsernamePasswordAuthenticationToken as
|
|
|
+ * the Principal
|
|
|
+ *
|
|
|
+ * @param userDetails the UserDetails to use.
|
|
|
+ * @return the {@link UnaryOperator<ServerWebExchange>}} to provide to
|
|
|
+ * {@link org.springframework.test.web.reactive.server.WebTestClient#exchangeMutator(UnaryOperator)}
|
|
|
+ */
|
|
|
+ public static UnaryOperator<ServerWebExchange> withUser(UserDetails userDetails) {
|
|
|
+ return withAuthentication(new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(), userDetails.getAuthorities()));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Updates the ServerWebExchange to use a UserDetails to create a UsernamePasswordAuthenticationToken as
|
|
|
+ * the Principal. This uses a default username of "user", password of "password", and granted authorities of
|
|
|
+ * "ROLE_USER".
|
|
|
+ *
|
|
|
+ * @return the {@link UnaryOperator<ServerWebExchange>}} to provide to
|
|
|
+ * {@link org.springframework.test.web.reactive.server.WebTestClient#exchangeMutator(UnaryOperator)}
|
|
|
+ */
|
|
|
+ public static UserExchangeMutator withUser() {
|
|
|
+ return withUser("user");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Updates the ServerWebExchange to use a UserDetails to create a UsernamePasswordAuthenticationToken as
|
|
|
+ * the Principal. This uses a default password of "password" and granted authorities of
|
|
|
+ * "ROLE_USER".
|
|
|
+ *
|
|
|
+ * @return the {@link UnaryOperator<ServerWebExchange>}} to provide to
|
|
|
+ * {@link org.springframework.test.web.reactive.server.WebTestClient#exchangeMutator(UnaryOperator)}
|
|
|
+ */
|
|
|
+ public static UserExchangeMutator withUser(String username) {
|
|
|
+ return new UserExchangeMutator(username);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Updates the WebServerExchange using {@code SecurityExchangeMutators#withUser(UserDetails)}. Defaults to use a
|
|
|
+ * password of "password" and granted authorities of "ROLE_USER".
|
|
|
+ */
|
|
|
+ public static class UserExchangeMutator implements UnaryOperator<ServerWebExchange> {
|
|
|
+ private final User.UserBuilder userBuilder;
|
|
|
+
|
|
|
+ private UserExchangeMutator(String username) {
|
|
|
+ userBuilder = User.withUsername(username);
|
|
|
+ password("password");
|
|
|
+ roles("USER");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Specifies the password to use. Default is "password".
|
|
|
+ * @param password the password to use
|
|
|
+ * @return the UserExchangeMutator
|
|
|
+ */
|
|
|
+ public UserExchangeMutator password(String password) {
|
|
|
+ userBuilder.password(password);
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Specifies the roles to use. Default is "USER". This is similar to authorities except each role is
|
|
|
+ * automatically prefixed with "ROLE_USER".
|
|
|
+ *
|
|
|
+ * @param roles the roles to use.
|
|
|
+ * @return the UserExchangeMutator
|
|
|
+ */
|
|
|
+ public UserExchangeMutator roles(String... roles) {
|
|
|
+ userBuilder.roles(roles);
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Specifies the {@code GrantedAuthority}s to use. Default is "ROLE_USER".
|
|
|
+ *
|
|
|
+ * @param authorities the authorities to use.
|
|
|
+ * @return the UserExchangeMutator
|
|
|
+ */
|
|
|
+ public UserExchangeMutator authorities(GrantedAuthority... authorities) {
|
|
|
+ userBuilder.authorities(authorities);
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Specifies the {@code GrantedAuthority}s to use. Default is "ROLE_USER".
|
|
|
+ *
|
|
|
+ * @param authorities the authorities to use.
|
|
|
+ * @return the UserExchangeMutator
|
|
|
+ */
|
|
|
+ public UserExchangeMutator authorities(Collection<? extends GrantedAuthority> authorities) {
|
|
|
+ userBuilder.authorities(authorities);
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Specifies the {@code GrantedAuthority}s to use. Default is "ROLE_USER".
|
|
|
+ * @param authorities the authorities to use.
|
|
|
+ * @return the UserExchangeMutator
|
|
|
+ */
|
|
|
+ public UserExchangeMutator authorities(String... authorities) {
|
|
|
+ userBuilder.authorities(authorities);
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ public UserExchangeMutator accountExpired(boolean accountExpired) {
|
|
|
+ userBuilder.accountExpired(accountExpired);
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ public UserExchangeMutator accountLocked(boolean accountLocked) {
|
|
|
+ userBuilder.accountLocked(accountLocked);
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ public UserExchangeMutator credentialsExpired(boolean credentialsExpired) {
|
|
|
+ userBuilder.credentialsExpired(credentialsExpired);
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ public UserExchangeMutator disabled(boolean disabled) {
|
|
|
+ userBuilder.disabled(disabled);
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ServerWebExchange apply(ServerWebExchange serverWebExchange) {
|
|
|
+ return withUser(userBuilder.build()).apply(serverWebExchange);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|