Skip to content

Commit 00e4a8f

Browse files
Add support for One-Time Token Login
Closes gh-15114
1 parent 5c56bdd commit 00e4a8f

28 files changed

+2116
-2
lines changed

config/src/main/java/org/springframework/security/config/annotation/web/HttpSecurityBuilder.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ public interface HttpSecurityBuilder<H extends HttpSecurityBuilder<H>>
157157
* <li>{@link DigestAuthenticationFilter}</li>
158158
* <li>{@link BearerTokenAuthenticationFilter}</li>
159159
* <li>{@link BasicAuthenticationFilter}</li>
160+
* <li>{@link org.springframework.security.web.authentication.AuthenticationFilter}</li>
160161
* <li>{@link RequestCacheAwareFilter}</li>
161162
* <li>{@link SecurityContextHolderAwareRequestFilter}</li>
162163
* <li>{@link JaasApiIntegrationFilter}</li>

config/src/main/java/org/springframework/security/config/annotation/web/builders/FilterOrderRegistration.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,17 @@
2727
import org.springframework.security.web.access.intercept.AuthorizationFilter;
2828
import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;
2929
import org.springframework.security.web.authentication.AnonymousAuthenticationFilter;
30+
import org.springframework.security.web.authentication.AuthenticationFilter;
3031
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
3132
import org.springframework.security.web.authentication.logout.LogoutFilter;
33+
import org.springframework.security.web.authentication.ott.GenerateOneTimeTokenFilter;
3234
import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter;
3335
import org.springframework.security.web.authentication.preauth.x509.X509AuthenticationFilter;
3436
import org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter;
3537
import org.springframework.security.web.authentication.switchuser.SwitchUserFilter;
3638
import org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter;
3739
import org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter;
40+
import org.springframework.security.web.authentication.ui.DefaultOneTimeTokenSubmitPageGeneratingFilter;
3841
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
3942
import org.springframework.security.web.authentication.www.DigestAuthenticationFilter;
4043
import org.springframework.security.web.context.SecurityContextHolderFilter;
@@ -87,6 +90,7 @@ final class FilterOrderRegistration {
8790
this.filterToOrder.put(
8891
"org.springframework.security.saml2.provider.service.web.Saml2WebSsoAuthenticationRequestFilter",
8992
order.next());
93+
put(GenerateOneTimeTokenFilter.class, order.next());
9094
put(X509AuthenticationFilter.class, order.next());
9195
put(AbstractPreAuthenticatedProcessingFilter.class, order.next());
9296
this.filterToOrder.put("org.springframework.security.cas.web.CasAuthenticationFilter", order.next());
@@ -99,12 +103,14 @@ final class FilterOrderRegistration {
99103
order.next(); // gh-8105
100104
put(DefaultLoginPageGeneratingFilter.class, order.next());
101105
put(DefaultLogoutPageGeneratingFilter.class, order.next());
106+
put(DefaultOneTimeTokenSubmitPageGeneratingFilter.class, order.next());
102107
put(ConcurrentSessionFilter.class, order.next());
103108
put(DigestAuthenticationFilter.class, order.next());
104109
this.filterToOrder.put(
105110
"org.springframework.security.oauth2.server.resource.web.authentication.BearerTokenAuthenticationFilter",
106111
order.next());
107112
put(BasicAuthenticationFilter.class, order.next());
113+
put(AuthenticationFilter.class, order.next());
108114
put(RequestCacheAwareFilter.class, order.next());
109115
put(SecurityContextHolderAwareRequestFilter.class, order.next());
110116
put(JaasApiIntegrationFilter.class, order.next());

config/src/main/java/org/springframework/security/config/annotation/web/builders/HttpSecurity.java

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2023 the original author or authors.
2+
* Copyright 2002-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -72,6 +72,7 @@
7272
import org.springframework.security.config.annotation.web.configurers.oauth2.client.OAuth2LoginConfigurer;
7373
import org.springframework.security.config.annotation.web.configurers.oauth2.client.OidcLogoutConfigurer;
7474
import org.springframework.security.config.annotation.web.configurers.oauth2.server.resource.OAuth2ResourceServerConfigurer;
75+
import org.springframework.security.config.annotation.web.configurers.ott.OneTimeTokenLoginConfigurer;
7576
import org.springframework.security.config.annotation.web.configurers.saml2.Saml2LoginConfigurer;
7677
import org.springframework.security.config.annotation.web.configurers.saml2.Saml2LogoutConfigurer;
7778
import org.springframework.security.config.annotation.web.configurers.saml2.Saml2MetadataConfigurer;
@@ -2978,6 +2979,45 @@ public HttpSecurity oauth2ResourceServer(
29782979
return HttpSecurity.this;
29792980
}
29802981

2982+
/**
2983+
* Configures One-Time Token Login Support.
2984+
*
2985+
* <h2>Example Configuration</h2>
2986+
*
2987+
* <pre>
2988+
* &#064;Configuration
2989+
* &#064;EnableWebSecurity
2990+
* public class SecurityConfig {
2991+
*
2992+
* &#064;Bean
2993+
* public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
2994+
* http
2995+
* .authorizeHttpRequests((authorize) -&gt; authorize
2996+
* .anyRequest().authenticated()
2997+
* )
2998+
* .oneTimeTokenLogin(Customizer.withDefaults());
2999+
* return http.build();
3000+
* }
3001+
*
3002+
* &#064;Bean
3003+
* public GeneratedOneTimeTokenHandler generatedOneTimeTokenHandler() {
3004+
* return new MyMagicLinkGeneratedOneTimeTokenHandler();
3005+
* }
3006+
*
3007+
* }
3008+
* </pre>
3009+
* @param oneTimeTokenLoginConfigurerCustomizer the {@link Customizer} to provide more
3010+
* options for the {@link OneTimeTokenLoginConfigurer}
3011+
* @return the {@link HttpSecurity} for further customizations
3012+
* @throws Exception
3013+
*/
3014+
public HttpSecurity oneTimeTokenLogin(
3015+
Customizer<OneTimeTokenLoginConfigurer<HttpSecurity>> oneTimeTokenLoginConfigurerCustomizer)
3016+
throws Exception {
3017+
oneTimeTokenLoginConfigurerCustomizer.customize(getOrApply(new OneTimeTokenLoginConfigurer<>(getContext())));
3018+
return HttpSecurity.this;
3019+
}
3020+
29813021
/**
29823022
* Configures channel security. In order for this configuration to be useful at least
29833023
* one mapping to a required channel must be provided.

0 commit comments

Comments
 (0)