Skip to content

Commit 36f1de9

Browse files
committed
Add OneTimeTokenAuthentication
Closes gh-17799
1 parent 6663eea commit 36f1de9

File tree

6 files changed

+77
-5
lines changed

6 files changed

+77
-5
lines changed

config/src/test/java/org/springframework/security/SerializationSamples.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
import org.springframework.security.authentication.jaas.event.JaasAuthenticationSuccessEvent;
7979
import org.springframework.security.authentication.ott.DefaultOneTimeToken;
8080
import org.springframework.security.authentication.ott.InvalidOneTimeTokenException;
81+
import org.springframework.security.authentication.ott.OneTimeTokenAuthentication;
8182
import org.springframework.security.authentication.ott.OneTimeTokenAuthenticationToken;
8283
import org.springframework.security.authentication.password.CompromisedPasswordException;
8384
import org.springframework.security.authorization.AuthorityAuthorizationDecision;
@@ -400,6 +401,8 @@ final class SerializationSamples {
400401
});
401402
generatorByClassName.put(OneTimeTokenAuthenticationToken.class,
402403
(r) -> applyDetails(new OneTimeTokenAuthenticationToken("username", "token")));
404+
generatorByClassName.put(OneTimeTokenAuthentication.class,
405+
(r) -> applyDetails(new OneTimeTokenAuthentication("username", authentication.getAuthorities())));
403406
generatorByClassName.put(AccessDeniedException.class,
404407
(r) -> new AccessDeniedException("access denied", new RuntimeException()));
405408
generatorByClassName.put(AuthorizationServiceException.class,
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* Copyright 2004-present the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.security.authentication.ott;
18+
19+
import java.io.Serial;
20+
import java.util.Collection;
21+
22+
import org.jspecify.annotations.Nullable;
23+
24+
import org.springframework.security.authentication.AbstractAuthenticationToken;
25+
import org.springframework.security.core.GrantedAuthority;
26+
27+
/**
28+
* The result of a successful one-time-token authentication
29+
*
30+
* @author Josh Cummings
31+
* @since 7.0
32+
*/
33+
public class OneTimeTokenAuthentication extends AbstractAuthenticationToken {
34+
35+
@Serial
36+
private static final long serialVersionUID = 1195893764725073959L;
37+
38+
private final Object principal;
39+
40+
public OneTimeTokenAuthentication(Object principal, Collection<? extends GrantedAuthority> authorities) {
41+
super(authorities);
42+
this.principal = principal;
43+
setAuthenticated(true);
44+
}
45+
46+
@Override
47+
public Object getPrincipal() {
48+
return this.principal;
49+
}
50+
51+
@Override
52+
public @Nullable Object getCredentials() {
53+
return null;
54+
}
55+
56+
}

core/src/main/java/org/springframework/security/authentication/ott/OneTimeTokenAuthenticationProvider.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,7 @@ public Authentication authenticate(Authentication authentication) throws Authent
5656
}
5757
try {
5858
UserDetails user = this.userDetailsService.loadUserByUsername(consumed.getUsername());
59-
OneTimeTokenAuthenticationToken authenticated = OneTimeTokenAuthenticationToken.authenticated(user,
60-
user.getAuthorities());
59+
OneTimeTokenAuthentication authenticated = new OneTimeTokenAuthentication(user, user.getAuthorities());
6160
authenticated.setDetails(otpAuthenticationToken.getDetails());
6261
return authenticated;
6362
}

core/src/main/java/org/springframework/security/authentication/ott/OneTimeTokenAuthenticationToken.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ public class OneTimeTokenAuthenticationToken extends AbstractAuthenticationToken
4040

4141
private @Nullable String tokenValue;
4242

43+
/**
44+
* @deprecated Please use constructor that takes a {@link String} instead
45+
*/
46+
@Deprecated(forRemoval = true, since = "7.0")
4347
public OneTimeTokenAuthenticationToken(@Nullable Object principal, String tokenValue) {
4448
super(Collections.emptyList());
4549
this.tokenValue = tokenValue;
@@ -50,6 +54,10 @@ public OneTimeTokenAuthenticationToken(String tokenValue) {
5054
this(null, tokenValue);
5155
}
5256

57+
/**
58+
* @deprecated Please use {@link OneTimeTokenAuthentication} instead
59+
*/
60+
@Deprecated(forRemoval = true, since = "7.0")
5361
public OneTimeTokenAuthenticationToken(Object principal, Collection<? extends GrantedAuthority> authorities) {
5462
super(authorities);
5563
this.principal = principal;
@@ -60,7 +68,9 @@ public OneTimeTokenAuthenticationToken(Object principal, Collection<? extends Gr
6068
* Creates an unauthenticated token
6169
* @param tokenValue the one-time token value
6270
* @return an unauthenticated {@link OneTimeTokenAuthenticationToken}
71+
* @deprecated Please use constructor that takes a {@link String} instead
6372
*/
73+
@Deprecated(forRemoval = true, since = "7.0")
6474
public static OneTimeTokenAuthenticationToken unauthenticated(String tokenValue) {
6575
return new OneTimeTokenAuthenticationToken(null, tokenValue);
6676
}
@@ -70,7 +80,9 @@ public static OneTimeTokenAuthenticationToken unauthenticated(String tokenValue)
7080
* @param principal the principal
7181
* @param tokenValue the one-time token value
7282
* @return an unauthenticated {@link OneTimeTokenAuthenticationToken}
83+
* @deprecated Please use constructor that takes a {@link String} instead
7384
*/
85+
@Deprecated(forRemoval = true, since = "7.0")
7486
public static OneTimeTokenAuthenticationToken unauthenticated(Object principal, String tokenValue) {
7587
return new OneTimeTokenAuthenticationToken(principal, tokenValue);
7688
}
@@ -80,7 +92,9 @@ public static OneTimeTokenAuthenticationToken unauthenticated(Object principal,
8092
* @param principal the principal
8193
* @param authorities the principal authorities
8294
* @return an authenticated {@link OneTimeTokenAuthenticationToken}
95+
* @deprecated Please use {@link OneTimeTokenAuthentication} instead
8396
*/
97+
@Deprecated(forRemoval = true, since = "7.0")
8498
public static OneTimeTokenAuthenticationToken authenticated(Object principal,
8599
Collection<? extends GrantedAuthority> authorities) {
86100
return new OneTimeTokenAuthenticationToken(principal, authorities);

core/src/main/java/org/springframework/security/authentication/ott/reactive/OneTimeTokenReactiveAuthenticationManager.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import org.springframework.security.authentication.ReactiveAuthenticationManager;
2424
import org.springframework.security.authentication.ott.InvalidOneTimeTokenException;
25+
import org.springframework.security.authentication.ott.OneTimeTokenAuthentication;
2526
import org.springframework.security.authentication.ott.OneTimeTokenAuthenticationToken;
2627
import org.springframework.security.core.Authentication;
2728
import org.springframework.security.core.userdetails.ReactiveUserDetailsService;
@@ -59,10 +60,9 @@ public Mono<Authentication> authenticate(Authentication authentication) {
5960
.map(onSuccess(otpAuthenticationToken));
6061
}
6162

62-
private Function<UserDetails, OneTimeTokenAuthenticationToken> onSuccess(OneTimeTokenAuthenticationToken token) {
63+
private Function<UserDetails, OneTimeTokenAuthentication> onSuccess(OneTimeTokenAuthenticationToken token) {
6364
return (user) -> {
64-
OneTimeTokenAuthenticationToken authenticated = OneTimeTokenAuthenticationToken.authenticated(user,
65-
user.getAuthorities());
65+
OneTimeTokenAuthentication authenticated = new OneTimeTokenAuthentication(user, user.getAuthorities());
6666
authenticated.setDetails(token.getDetails());
6767
return authenticated;
6868
};

0 commit comments

Comments
 (0)