|  | 
| 1 | 1 | /* | 
| 2 |  | - * Copyright 2002-2024 the original author or authors. | 
|  | 2 | + * Copyright 2002-2025 the original author or authors. | 
| 3 | 3 |  * | 
| 4 | 4 |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
| 5 | 5 |  * you may not use this file except in compliance with the License. | 
|  | 
| 29 | 29 | import java.util.Iterator; | 
| 30 | 30 | import java.util.List; | 
| 31 | 31 | import java.util.Map; | 
|  | 32 | +import java.util.Objects; | 
| 32 | 33 | import java.util.UUID; | 
| 33 | 34 | import java.util.function.Consumer; | 
| 34 | 35 | import java.util.function.Function; | 
|  | 
| 53 | 54 | import org.springframework.security.authentication.DelegatingReactiveAuthenticationManager; | 
| 54 | 55 | import org.springframework.security.authentication.ReactiveAuthenticationManager; | 
| 55 | 56 | import org.springframework.security.authentication.ReactiveAuthenticationManagerResolver; | 
|  | 57 | +import org.springframework.security.authentication.ott.GenerateOneTimeTokenRequest; | 
| 56 | 58 | import org.springframework.security.authentication.ott.OneTimeToken; | 
| 57 | 59 | import org.springframework.security.authentication.ott.reactive.InMemoryReactiveOneTimeTokenService; | 
| 58 | 60 | import org.springframework.security.authentication.ott.reactive.OneTimeTokenReactiveAuthenticationManager; | 
|  | 
| 156 | 158 | import org.springframework.security.web.server.authentication.logout.SecurityContextServerLogoutHandler; | 
| 157 | 159 | import org.springframework.security.web.server.authentication.logout.ServerLogoutHandler; | 
| 158 | 160 | import org.springframework.security.web.server.authentication.logout.ServerLogoutSuccessHandler; | 
|  | 161 | +import org.springframework.security.web.server.authentication.ott.DefaultServerGenerateOneTimeTokenRequestResolver; | 
| 159 | 162 | import org.springframework.security.web.server.authentication.ott.GenerateOneTimeTokenWebFilter; | 
|  | 163 | +import org.springframework.security.web.server.authentication.ott.ServerGenerateOneTimeTokenRequestResolver; | 
| 160 | 164 | import org.springframework.security.web.server.authentication.ott.ServerOneTimeTokenAuthenticationConverter; | 
| 161 | 165 | import org.springframework.security.web.server.authentication.ott.ServerOneTimeTokenGenerationSuccessHandler; | 
| 162 | 166 | import org.springframework.security.web.server.authorization.AuthorizationContext; | 
| @@ -5940,6 +5944,8 @@ public final class OneTimeTokenLoginSpec { | 
| 5940 | 5944 | 
 | 
| 5941 | 5945 | 		private ServerSecurityContextRepository securityContextRepository; | 
| 5942 | 5946 | 
 | 
|  | 5947 | +		private ServerGenerateOneTimeTokenRequestResolver requestResolver; | 
|  | 5948 | + | 
| 5943 | 5949 | 		private String loginProcessingUrl = "/login/ott"; | 
| 5944 | 5950 | 
 | 
| 5945 | 5951 | 		private String defaultSubmitPageUrl = "/login/ott"; | 
| @@ -5985,6 +5991,7 @@ private void configureOttGenerateFilter(ServerHttpSecurity http) { | 
| 5985 | 5991 | 					getTokenGenerationSuccessHandler()); | 
| 5986 | 5992 | 			generateFilter | 
| 5987 | 5993 | 				.setRequestMatcher(ServerWebExchangeMatchers.pathMatchers(HttpMethod.POST, this.tokenGeneratingUrl)); | 
|  | 5994 | +			generateFilter.setGenerateRequestResolver(getRequestResolver()); | 
| 5988 | 5995 | 			http.addFilterAt(generateFilter, SecurityWebFiltersOrder.ONE_TIME_TOKEN); | 
| 5989 | 5996 | 		} | 
| 5990 | 5997 | 
 | 
| @@ -6112,6 +6119,32 @@ public OneTimeTokenLoginSpec authenticationConverter(ServerAuthenticationConvert | 
| 6112 | 6119 | 			return this; | 
| 6113 | 6120 | 		} | 
| 6114 | 6121 | 
 | 
|  | 6122 | +		/** | 
|  | 6123 | +		 * Use this {@link ServerGenerateOneTimeTokenRequestResolver} when resolving | 
|  | 6124 | +		 * {@link GenerateOneTimeTokenRequest} from {@link ServerWebExchange}. By default, | 
|  | 6125 | +		 * the {@link DefaultServerGenerateOneTimeTokenRequestResolver} is used. | 
|  | 6126 | +		 * @param requestResolver the | 
|  | 6127 | +		 * {@link DefaultServerGenerateOneTimeTokenRequestResolver} to use | 
|  | 6128 | +		 * @since 6.5 | 
|  | 6129 | +		 */ | 
|  | 6130 | +		public OneTimeTokenLoginSpec generateRequestResolver( | 
|  | 6131 | +				ServerGenerateOneTimeTokenRequestResolver requestResolver) { | 
|  | 6132 | +			Assert.notNull(requestResolver, "generateRequestResolver cannot be null"); | 
|  | 6133 | +			this.requestResolver = requestResolver; | 
|  | 6134 | +			return this; | 
|  | 6135 | +		} | 
|  | 6136 | + | 
|  | 6137 | +		private ServerGenerateOneTimeTokenRequestResolver getRequestResolver() { | 
|  | 6138 | +			if (this.requestResolver != null) { | 
|  | 6139 | +				return this.requestResolver; | 
|  | 6140 | +			} | 
|  | 6141 | +			ServerGenerateOneTimeTokenRequestResolver bean = getBeanOrNull( | 
|  | 6142 | +					ServerGenerateOneTimeTokenRequestResolver.class); | 
|  | 6143 | +			this.requestResolver = Objects.requireNonNullElseGet(bean, | 
|  | 6144 | +					DefaultServerGenerateOneTimeTokenRequestResolver::new); | 
|  | 6145 | +			return this.requestResolver; | 
|  | 6146 | +		} | 
|  | 6147 | + | 
| 6115 | 6148 | 		/** | 
| 6116 | 6149 | 		 * Specifies the URL to process the login request, defaults to {@code /login/ott}. | 
| 6117 | 6150 | 		 * Only POST requests are processed, for that reason make sure that you pass a | 
|  | 
0 commit comments