31
31
import org .springframework .security .authentication .ott .InMemoryOneTimeTokenService ;
32
32
import org .springframework .security .authentication .ott .OneTimeToken ;
33
33
import org .springframework .security .authentication .ott .OneTimeTokenAuthenticationProvider ;
34
- import org .springframework .security .authentication .ott .OneTimeTokenSender ;
34
+ import org .springframework .security .authentication .ott .OneTimeTokenGenerateRequest ;
35
35
import org .springframework .security .authentication .ott .OneTimeTokenService ;
36
36
import org .springframework .security .config .Customizer ;
37
37
import org .springframework .security .config .annotation .web .HttpSecurityBuilder ;
44
44
import org .springframework .security .web .authentication .AuthenticationSuccessHandler ;
45
45
import org .springframework .security .web .authentication .SavedRequestAwareAuthenticationSuccessHandler ;
46
46
import org .springframework .security .web .authentication .SimpleUrlAuthenticationFailureHandler ;
47
+ import org .springframework .security .web .authentication .ott .GeneratedOneTimeTokenSuccessHandler ;
47
48
import org .springframework .security .web .authentication .ott .OneTimeTokenAuthenticationConverter ;
48
- import org .springframework .security .web .authentication .ott .OneTimeTokenAuthenticationRequestFilter ;
49
- import org .springframework .security .web .authentication .ott .OneTimeTokenAuthenticationRequestResolver ;
50
- import org .springframework .security .web .authentication .ott .OneTimeTokenAuthenticationRequestSuccessHandler ;
51
- import org .springframework .security .web .authentication .ott .RedirectOneTimeTokenAuthenticationRequestSuccessHandler ;
52
- import org .springframework .security .web .authentication .ott .RequestParameterOneTimeTokenAuthenticationRequestResolver ;
49
+ import org .springframework .security .web .authentication .ott .OneTimeTokenGenerateFilter ;
50
+ import org .springframework .security .web .authentication .ott .OneTimeTokenGenerateRequestResolver ;
51
+ import org .springframework .security .web .authentication .ott .RedirectGeneratedOneTimeTokenSuccessHandler ;
52
+ import org .springframework .security .web .authentication .ott .RequestParameterOneTimeTokenGenerateRequestResolver ;
53
53
import org .springframework .security .web .authentication .ui .DefaultLoginPageGeneratingFilter ;
54
54
import org .springframework .security .web .authentication .ui .DefaultOneTimeTokenSubmitPageGeneratingFilter ;
55
55
import org .springframework .security .web .context .HttpSessionSecurityContextRepository ;
63
63
public final class OneTimeTokenLoginConfigurer <H extends HttpSecurityBuilder <H >>
64
64
extends AbstractHttpConfigurer <OneTimeTokenLoginConfigurer <H >, H > {
65
65
66
+ private static final RedirectGeneratedOneTimeTokenSuccessHandler DEFAULT_GENERATED_OTT_SUCCESS_HANDLER = new RedirectGeneratedOneTimeTokenSuccessHandler (
67
+ "/login/ott" );
68
+
66
69
private final Log logger = LogFactory .getLog (getClass ());
67
70
68
71
private final ApplicationContext context ;
@@ -75,22 +78,19 @@ public final class OneTimeTokenLoginConfigurer<H extends HttpSecurityBuilder<H>>
75
78
76
79
private AuthenticationSuccessHandler authenticationSuccessHandler = new SavedRequestAwareAuthenticationSuccessHandler ();
77
80
78
- private OneTimeTokenSender oneTimeTokenSender ;
79
-
80
81
private String submitPageUrl = "/login/ott" ;
81
82
82
83
private boolean submitPageEnabled = true ;
83
84
84
85
private String loginProcessingUrl = "/login/ott" ;
85
86
86
- private String authenticationRequestUrl = "/ott/authenticate " ;
87
+ private String generateUrl = "/ott/generate " ;
87
88
88
- private OneTimeTokenAuthenticationRequestSuccessHandler authenticationRequestSuccessHandler = new RedirectOneTimeTokenAuthenticationRequestSuccessHandler (
89
- "/login/ott" );
89
+ private GeneratedOneTimeTokenSuccessHandler generatedOneTimeTokenSuccessHandler = DEFAULT_GENERATED_OTT_SUCCESS_HANDLER ;
90
90
91
91
private AuthenticationProvider authenticationProvider ;
92
92
93
- private OneTimeTokenAuthenticationRequestResolver authenticationRequestResolver = new RequestParameterOneTimeTokenAuthenticationRequestResolver ();
93
+ private OneTimeTokenGenerateRequestResolver oneTimeTokenGenerateRequestResolver = new RequestParameterOneTimeTokenGenerateRequestResolver ();
94
94
95
95
public OneTimeTokenLoginConfigurer (ApplicationContext context ) {
96
96
this .context = context ;
@@ -110,7 +110,7 @@ private void configureDefaultLoginPage(H http) {
110
110
return ;
111
111
}
112
112
loginPageGeneratingFilter .setOneTimeTokenEnabled (true );
113
- loginPageGeneratingFilter .setOneTimeTokenAuthenticationRequestUrl (this .authenticationRequestUrl );
113
+ loginPageGeneratingFilter .setOneTimeTokenAuthenticationRequestUrl (this .generateUrl );
114
114
if (this .authenticationFailureHandler == null
115
115
&& StringUtils .hasText (loginPageGeneratingFilter .getLoginPageUrl ())) {
116
116
this .authenticationFailureHandler = new SimpleUrlAuthenticationFailureHandler (
@@ -121,7 +121,7 @@ private void configureDefaultLoginPage(H http) {
121
121
@ Override
122
122
public void configure (H http ) {
123
123
configureSubmitPage (http );
124
- configureOttAuthenticationRequestFilter (http );
124
+ configureOttGenerateFilter (http );
125
125
configureOttAuthenticationFilter (http );
126
126
}
127
127
@@ -144,13 +144,24 @@ private SecurityContextRepository getSecurityContextRepository(H http) {
144
144
return new HttpSessionSecurityContextRepository ();
145
145
}
146
146
147
- private void configureOttAuthenticationRequestFilter (H http ) {
148
- OneTimeTokenAuthenticationRequestFilter authenticationRequestFilter = new OneTimeTokenAuthenticationRequestFilter (
149
- getOneTimeTokenService (http ), getOneTimeTokenSender (http ));
150
- authenticationRequestFilter .setAuthenticationRequestResolver (this .authenticationRequestResolver );
151
- authenticationRequestFilter .setAuthenticationRequestSuccessHandler (this .authenticationRequestSuccessHandler );
152
- authenticationRequestFilter .setRequestMatcher (antMatcher (HttpMethod .POST , this .authenticationRequestUrl ));
153
- http .addFilter (postProcess (authenticationRequestFilter ));
147
+ private void configureOttGenerateFilter (H http ) {
148
+ OneTimeTokenGenerateFilter generateFilter = new OneTimeTokenGenerateFilter (getOneTimeTokenService (http ));
149
+ generateFilter .setOneTimeTokenGenerateRequestResolver (this .oneTimeTokenGenerateRequestResolver );
150
+ generateFilter .setGeneratedOneTimeTokenSuccessHandler (getGeneratedOneTimeTokenSuccessHandler ());
151
+ generateFilter .setRequestMatcher (antMatcher (HttpMethod .POST , this .generateUrl ));
152
+ http .addFilter (postProcess (generateFilter ));
153
+ }
154
+
155
+ private GeneratedOneTimeTokenSuccessHandler getGeneratedOneTimeTokenSuccessHandler () {
156
+ if (this .generatedOneTimeTokenSuccessHandler == DEFAULT_GENERATED_OTT_SUCCESS_HANDLER ) {
157
+ this .logger
158
+ .debug ("""
159
+ Using RedirectGeneratedOneTimeTokenSuccessHandler as the default GeneratedOneTimeTokenSuccessHandler.
160
+ Note that this implementation does not send the one-time token to the user, therefore, consider
161
+ providing your own implementation.
162
+ """ );
163
+ }
164
+ return this .generatedOneTimeTokenSuccessHandler ;
154
165
}
155
166
156
167
private void configureSubmitPage (H http ) {
@@ -175,15 +186,15 @@ private AuthenticationProvider getAuthenticationProvider(H http) {
175
186
}
176
187
177
188
/**
178
- * Specifies the {@link OneTimeTokenAuthenticationRequestResolver } to use to resolve a
179
- * {@link org.springframework.security.authentication.ott.OneTimeTokenAuthenticationRequest}.
180
- * Defaults to {@link RequestParameterOneTimeTokenAuthenticationRequestResolver }
181
- * @param authenticationRequestResolver
189
+ * Specifies the {@link OneTimeTokenGenerateRequestResolver } to use to resolve a
190
+ * {@link OneTimeTokenGenerateRequest}. Defaults to
191
+ * {@link RequestParameterOneTimeTokenGenerateRequestResolver }
192
+ * @param oneTimeTokenGenerateRequestResolver
182
193
*/
183
- public OneTimeTokenLoginConfigurer <H > authenticationRequestResolver (
184
- OneTimeTokenAuthenticationRequestResolver authenticationRequestResolver ) {
185
- Assert .notNull (authenticationRequestResolver , "authenticationRequestResolver cannot be null" );
186
- this .authenticationRequestResolver = authenticationRequestResolver ;
194
+ public OneTimeTokenLoginConfigurer <H > oneTimeTokenGenerationRequestResolver (
195
+ OneTimeTokenGenerateRequestResolver oneTimeTokenGenerateRequestResolver ) {
196
+ Assert .notNull (oneTimeTokenGenerateRequestResolver , "oneTimeTokenGenerationRequestResolver cannot be null" );
197
+ this .oneTimeTokenGenerateRequestResolver = oneTimeTokenGenerateRequestResolver ;
187
198
return this ;
188
199
}
189
200
@@ -198,26 +209,28 @@ public OneTimeTokenLoginConfigurer<H> authenticationProvider(AuthenticationProvi
198
209
}
199
210
200
211
/**
201
- * Specifies the URL that a One-Time Token authentication request will be processed.
202
- * Defaults to {@code POST /ott/authenticate }.
203
- * @param authenticationRequestUrl
212
+ * Specifies the URL that a One-Time Token generate request will be processed.
213
+ * Defaults to {@code POST /ott/generate }.
214
+ * @param generateUrl
204
215
*/
205
- public OneTimeTokenLoginConfigurer <H > authenticationRequestUrl (String authenticationRequestUrl ) {
206
- Assert .hasText (authenticationRequestUrl , "authenticationRequestUrl cannot be null or empty" );
207
- this .authenticationRequestUrl = authenticationRequestUrl ;
216
+ public OneTimeTokenLoginConfigurer <H > generateUrl (String generateUrl ) {
217
+ Assert .hasText (generateUrl , "generateUrl cannot be null or empty" );
218
+ this .generateUrl = generateUrl ;
208
219
return this ;
209
220
}
210
221
211
222
/**
212
- * Specifies strategy to be used for successful one-time token authentication
213
- * requests. By default, a redirect will be performed to {@code POST /login/ott} using
214
- * the {@link RedirectOneTimeTokenAuthenticationRequestSuccessHandler}.
215
- * @param authenticationRequestSuccessHandler
223
+ * Specifies strategy to be used for successful generated one-time tokens. By default,
224
+ * a redirect will be performed to {@code POST /login/ott} using the
225
+ * {@link RedirectGeneratedOneTimeTokenSuccessHandler}. It is often needed to provide
226
+ * your own implementation of this interface so the one-time token is also delivered
227
+ * to the user.
228
+ * @param generatedOneTimeTokenSuccessHandler
216
229
*/
217
- public OneTimeTokenLoginConfigurer <H > authenticationRequestSuccessHandler (
218
- OneTimeTokenAuthenticationRequestSuccessHandler authenticationRequestSuccessHandler ) {
219
- Assert .notNull (authenticationRequestSuccessHandler , "authenticationRequestSuccessHandler cannot be null" );
220
- this .authenticationRequestSuccessHandler = authenticationRequestSuccessHandler ;
230
+ public OneTimeTokenLoginConfigurer <H > generatedOneTimeTokenSuccessHandler (
231
+ GeneratedOneTimeTokenSuccessHandler generatedOneTimeTokenSuccessHandler ) {
232
+ Assert .notNull (generatedOneTimeTokenSuccessHandler , "generatedOneTimeTokenSuccessHandler cannot be null" );
233
+ this .generatedOneTimeTokenSuccessHandler = generatedOneTimeTokenSuccessHandler ;
221
234
return this ;
222
235
}
223
236
@@ -257,17 +270,6 @@ public OneTimeTokenLoginConfigurer<H> submitPageUrl(String submitPageUrl) {
257
270
return this ;
258
271
}
259
272
260
- /**
261
- * Specifies the {@link OneTimeTokenSender} to send the generated {@link OneTimeToken}
262
- * to the user
263
- * @param oneTimeTokenSender
264
- */
265
- public OneTimeTokenLoginConfigurer <H > oneTimeTokenSender (OneTimeTokenSender oneTimeTokenSender ) {
266
- Assert .notNull (oneTimeTokenSender , "oneTimeTokenSender cannot be null" );
267
- this .oneTimeTokenSender = oneTimeTokenSender ;
268
- return this ;
269
- }
270
-
271
273
/**
272
274
* Configures the {@link OneTimeTokenService} used to generate and consume
273
275
* {@link OneTimeToken}
@@ -341,19 +343,6 @@ private OneTimeTokenService getOneTimeTokenService(H http) {
341
343
return this .oneTimeTokenService ;
342
344
}
343
345
344
- private OneTimeTokenSender getOneTimeTokenSender (H http ) {
345
- if (this .oneTimeTokenSender != null ) {
346
- return this .oneTimeTokenSender ;
347
- }
348
- OneTimeTokenSender bean = getBeanOrNull (http , OneTimeTokenSender .class );
349
- if (bean == null ) {
350
- throw new IllegalStateException ("A OneTimeTokenSender is required for oneTimeTokenLogin(). "
351
- + "Please define a bean or pass an instance to the DSL." );
352
- }
353
- this .oneTimeTokenSender = bean ;
354
- return this .oneTimeTokenSender ;
355
- }
356
-
357
346
private <C > C getBeanOrNull (H http , Class <C > clazz ) {
358
347
ApplicationContext context = http .getSharedObject (ApplicationContext .class );
359
348
if (context == null ) {
0 commit comments