@@ -3035,7 +3035,8 @@ protected void configure(ServerHttpSecurity http) {
3035
3035
return ;
3036
3036
}
3037
3037
if (http .formLogin != null && http .formLogin .isEntryPointExplicit
3038
- || http .oauth2Login != null && StringUtils .hasText (http .oauth2Login .loginPage )) {
3038
+ || http .oauth2Login != null && StringUtils .hasText (http .oauth2Login .loginPage )
3039
+ || http .oneTimeTokenLogin != null && StringUtils .hasText (http .oneTimeTokenLogin .loginPage )) {
3039
3040
return ;
3040
3041
}
3041
3042
LoginPageGeneratingWebFilter loginPage = null ;
@@ -3050,6 +3051,13 @@ protected void configure(ServerHttpSecurity http) {
3050
3051
}
3051
3052
loginPage .setOauth2AuthenticationUrlToClientName (urlToText );
3052
3053
}
3054
+ if (http .oneTimeTokenLogin != null ) {
3055
+ if (loginPage == null ) {
3056
+ loginPage = new LoginPageGeneratingWebFilter ();
3057
+ }
3058
+ loginPage .setOneTimeTokenEnabled (true );
3059
+ loginPage .setGenerateOneTimeTokenUrl (http .oneTimeTokenLogin .tokenGeneratingUrl );
3060
+ }
3053
3061
if (loginPage != null ) {
3054
3062
http .addFilterAt (loginPage , SecurityWebFiltersOrder .LOGIN_PAGE_GENERATING );
3055
3063
http .addFilterBefore (DefaultResourcesWebFilter .css (), SecurityWebFiltersOrder .LOGIN_PAGE_GENERATING );
@@ -5948,11 +5956,13 @@ public final class OneTimeTokenLoginSpec {
5948
5956
5949
5957
private boolean submitPageEnabled = true ;
5950
5958
5959
+ private String loginPage ;
5960
+
5951
5961
protected void configure (ServerHttpSecurity http ) {
5952
5962
configureSubmitPage (http );
5953
5963
configureOttGenerateFilter (http );
5954
5964
configureOttAuthenticationFilter (http );
5955
- configureDefaultLoginPage (http );
5965
+ configureDefaultEntryPoint (http );
5956
5966
}
5957
5967
5958
5968
private void configureOttAuthenticationFilter (ServerHttpSecurity http ) {
@@ -5988,17 +5998,29 @@ private void configureOttGenerateFilter(ServerHttpSecurity http) {
5988
5998
http .addFilterAt (generateFilter , SecurityWebFiltersOrder .ONE_TIME_TOKEN );
5989
5999
}
5990
6000
5991
- private void configureDefaultLoginPage (ServerHttpSecurity http ) {
5992
- if (http .formLogin != null ) {
5993
- for (WebFilter webFilter : http .webFilters ) {
5994
- OrderedWebFilter orderedWebFilter = (OrderedWebFilter ) webFilter ;
5995
- if (orderedWebFilter .webFilter instanceof LoginPageGeneratingWebFilter loginPageGeneratingFilter ) {
5996
- loginPageGeneratingFilter .setOneTimeTokenEnabled (true );
5997
- loginPageGeneratingFilter .setGenerateOneTimeTokenUrl (this .tokenGeneratingUrl );
5998
- break ;
5999
- }
6001
+ private void configureDefaultEntryPoint (ServerHttpSecurity http ) {
6002
+ MediaTypeServerWebExchangeMatcher htmlMatcher = new MediaTypeServerWebExchangeMatcher (
6003
+ MediaType .APPLICATION_XHTML_XML , new MediaType ("image" , "*" ), MediaType .TEXT_HTML ,
6004
+ MediaType .TEXT_PLAIN );
6005
+ htmlMatcher .setIgnoredMediaTypes (Collections .singleton (MediaType .ALL ));
6006
+ ServerWebExchangeMatcher xhrMatcher = (exchange ) -> {
6007
+ if (exchange .getRequest ().getHeaders ().getOrEmpty ("X-Requested-With" ).contains ("XMLHttpRequest" )) {
6008
+ return ServerWebExchangeMatcher .MatchResult .match ();
6000
6009
}
6010
+ return ServerWebExchangeMatcher .MatchResult .notMatch ();
6011
+ };
6012
+ ServerWebExchangeMatcher notXhrMatcher = new NegatedServerWebExchangeMatcher (xhrMatcher );
6013
+ ServerWebExchangeMatcher defaultEntryPointMatcher = new AndServerWebExchangeMatcher (notXhrMatcher ,
6014
+ htmlMatcher );
6015
+ String loginPage = "/login" ;
6016
+ if (this .loginPage != null ) {
6017
+ loginPage = this .loginPage ;
6001
6018
}
6019
+ RedirectServerAuthenticationEntryPoint defaultEntryPoint = new RedirectServerAuthenticationEntryPoint (
6020
+ loginPage );
6021
+ defaultEntryPoint .setRequestCache (http .requestCache .requestCache );
6022
+ http .defaultEntryPoints .add (new DelegateEntry (defaultEntryPointMatcher , defaultEntryPoint ));
6023
+
6002
6024
}
6003
6025
6004
6026
/**
@@ -6200,6 +6222,19 @@ Please provide it as a bean or pass it to the oneTimeTokenLogin() DSL.
6200
6222
return this .tokenGenerationSuccessHandler ;
6201
6223
}
6202
6224
6225
+ /**
6226
+ * Specifies the URL to send users to if login is required. A default login page
6227
+ * will be generated when this attribute is not specified.
6228
+ * @param loginPage the URL to send users to if login is required
6229
+ * @return the {@link OAuth2LoginSpec} for further configuration
6230
+ * @since 6.5
6231
+ */
6232
+ public OneTimeTokenLoginSpec loginPage (String loginPage ) {
6233
+ Assert .hasText (loginPage , "loginPage cannot be empty" );
6234
+ this .loginPage = loginPage ;
6235
+ return this ;
6236
+ }
6237
+
6203
6238
}
6204
6239
6205
6240
}
0 commit comments