Skip to content

Commit d4678c8

Browse files
committed
Add Missing Serialization Support
Closes gh-19013 Signed-off-by: Josh Cummings <3627351+jzheaux@users.noreply.github.com>
1 parent 43b132b commit d4678c8

32 files changed

Lines changed: 134 additions & 3 deletions

File tree

cas/src/main/java/org/springframework/security/cas/jackson/CasJacksonModule.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
* @since 7.0
4949
* @see SecurityJacksonModules
5050
*/
51+
@SuppressWarnings("serial")
5152
public class CasJacksonModule extends SecurityJacksonModule {
5253

5354
public CasJacksonModule() {

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

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.io.Serializable;
2121
import java.lang.reflect.Field;
2222
import java.security.Principal;
23+
import java.time.Duration;
2324
import java.time.Instant;
2425
import java.util.Collection;
2526
import java.util.Date;
@@ -85,6 +86,9 @@
8586
import org.springframework.security.authorization.AuthorityAuthorizationDecision;
8687
import org.springframework.security.authorization.AuthorizationDecision;
8788
import org.springframework.security.authorization.AuthorizationDeniedException;
89+
import org.springframework.security.authorization.FactorAuthorizationDecision;
90+
import org.springframework.security.authorization.RequiredFactor;
91+
import org.springframework.security.authorization.RequiredFactorError;
8892
import org.springframework.security.authorization.event.AuthorizationEvent;
8993
import org.springframework.security.authorization.event.AuthorizationGrantedEvent;
9094
import org.springframework.security.cas.authentication.CasAssertionAuthenticationToken;
@@ -161,22 +165,30 @@
161165
import org.springframework.security.oauth2.jwt.JwtValidationException;
162166
import org.springframework.security.oauth2.jwt.TestJwts;
163167
import org.springframework.security.oauth2.server.authorization.OAuth2Authorization;
168+
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationCode;
164169
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationConsent;
165170
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationServerMetadata;
166171
import org.springframework.security.oauth2.server.authorization.OAuth2ClientRegistration;
167172
import org.springframework.security.oauth2.server.authorization.OAuth2TokenIntrospection;
168173
import org.springframework.security.oauth2.server.authorization.OAuth2TokenType;
169174
import org.springframework.security.oauth2.server.authorization.TestOAuth2Authorizations;
170175
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AccessTokenAuthenticationToken;
176+
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationCodeRequestAuthenticationException;
171177
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationCodeRequestAuthenticationToken;
172178
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationConsentAuthenticationToken;
173179
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationGrantAuthenticationToken;
174180
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientAuthenticationToken;
181+
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientCredentialsAuthenticationToken;
175182
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientRegistrationAuthenticationToken;
176183
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2DeviceAuthorizationConsentAuthenticationToken;
177184
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2DeviceAuthorizationRequestAuthenticationToken;
185+
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2DeviceCodeAuthenticationToken;
178186
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2DeviceVerificationAuthenticationToken;
179187
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2PushedAuthorizationRequestAuthenticationToken;
188+
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2RefreshTokenAuthenticationToken;
189+
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2TokenExchangeActor;
190+
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2TokenExchangeAuthenticationToken;
191+
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2TokenExchangeCompositeAuthenticationToken;
180192
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2TokenIntrospectionAuthenticationToken;
181193
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2TokenRevocationAuthenticationToken;
182194
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
@@ -190,6 +202,7 @@
190202
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
191203
import org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat;
192204
import org.springframework.security.oauth2.server.authorization.settings.TokenSettings;
205+
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenClaimNames;
193206
import org.springframework.security.oauth2.server.resource.BearerTokenError;
194207
import org.springframework.security.oauth2.server.resource.BearerTokenErrors;
195208
import org.springframework.security.oauth2.server.resource.InvalidBearerTokenException;
@@ -429,6 +442,8 @@ final class SerializationSamples {
429442
generatorByClassName.put(RegisteredClient.class, (r) -> registeredClient);
430443
generatorByClassName.put(OAuth2Authorization.class, (r) -> authorization);
431444
generatorByClassName.put(OAuth2Authorization.Token.class, (r) -> authorization.getAccessToken());
445+
generatorByClassName.put(OAuth2AuthorizationCode.class,
446+
(r) -> new OAuth2AuthorizationCode("code", Instant.now(), Instant.now().plusSeconds(300)));
432447
generatorByClassName.put(OAuth2AuthorizationConsent.class,
433448
(r) -> OAuth2AuthorizationConsent.withId("registeredClientId", "principalName")
434449
.scope("scope1")
@@ -454,6 +469,58 @@ final class SerializationSamples {
454469
authenticationToken.setDetails(details);
455470
return authenticationToken;
456471
});
472+
generatorByClassName.put(
473+
org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationCodeAuthenticationToken.class,
474+
(r) -> {
475+
org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationCodeAuthenticationToken token = new org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationCodeAuthenticationToken(
476+
"code", principal, "https://localhost/callback", Map.of("custom_param", "custom_value"));
477+
token.setDetails(details);
478+
return token;
479+
});
480+
generatorByClassName.put(OAuth2AuthorizationCodeRequestAuthenticationException.class, (r) -> {
481+
OAuth2AuthorizationCodeRequestAuthenticationToken authToken = new OAuth2AuthorizationCodeRequestAuthenticationToken(
482+
"https://localhost/authorize", "clientId", principal, "https://localhost/callback", "state",
483+
authorizationRequest.getScopes(), authorizationRequest.getAdditionalParameters());
484+
return new OAuth2AuthorizationCodeRequestAuthenticationException(
485+
new OAuth2Error("invalid_request", "Missing required parameter", "https://example.com/error"),
486+
authToken);
487+
});
488+
generatorByClassName.put(OAuth2ClientCredentialsAuthenticationToken.class, (r) -> {
489+
OAuth2ClientCredentialsAuthenticationToken token = new OAuth2ClientCredentialsAuthenticationToken(principal,
490+
Set.of("scope1", "scope2"), Map.of("custom_param", "custom_value"));
491+
token.setDetails(details);
492+
return token;
493+
});
494+
generatorByClassName.put(OAuth2DeviceCodeAuthenticationToken.class, (r) -> {
495+
OAuth2DeviceCodeAuthenticationToken token = new OAuth2DeviceCodeAuthenticationToken("device-code",
496+
principal, Map.of("custom_param", "custom_value"));
497+
token.setDetails(details);
498+
return token;
499+
});
500+
generatorByClassName.put(OAuth2RefreshTokenAuthenticationToken.class, (r) -> {
501+
OAuth2RefreshTokenAuthenticationToken token = new OAuth2RefreshTokenAuthenticationToken("refresh-token",
502+
principal, Set.of("scope1", "scope2"), Map.of("custom_param", "custom_value"));
503+
token.setDetails(details);
504+
return token;
505+
});
506+
generatorByClassName.put(OAuth2TokenExchangeAuthenticationToken.class, (r) -> {
507+
OAuth2TokenExchangeAuthenticationToken token = new OAuth2TokenExchangeAuthenticationToken(
508+
"urn:ietf:params:oauth:token-type:access_token", "subject-token",
509+
"urn:ietf:params:oauth:token-type:jwt", principal, "actor-token",
510+
"urn:ietf:params:oauth:token-type:jwt", Set.of("https://resource.example.com"), Set.of("audience"),
511+
Set.of("scope1"), Map.of("custom_param", "custom_value"));
512+
token.setDetails(details);
513+
return token;
514+
});
515+
OAuth2TokenExchangeActor actor = new OAuth2TokenExchangeActor(Map.of(OAuth2TokenClaimNames.ISS,
516+
"https://issuer.example.com", OAuth2TokenClaimNames.SUB, "actor-subject"));
517+
generatorByClassName.put(OAuth2TokenExchangeActor.class, (r) -> actor);
518+
generatorByClassName.put(OAuth2TokenExchangeCompositeAuthenticationToken.class, (r) -> {
519+
AbstractAuthenticationToken token = new OAuth2TokenExchangeCompositeAuthenticationToken(authentication,
520+
List.of(actor));
521+
token.setDetails(details);
522+
return token;
523+
});
457524
generatorByClassName.put(OAuth2AuthorizationConsentAuthenticationToken.class, (r) -> {
458525
OAuth2AuthorizationConsentAuthenticationToken authenticationToken = new OAuth2AuthorizationConsentAuthenticationToken(
459526
"authorizationUri", "clientId", principal, "state", authorizationRequest.getScopes(),
@@ -670,6 +737,12 @@ final class SerializationSamples {
670737
generatorByClassName.put(AuthorizationDecision.class, (r) -> new AuthorizationDecision(true));
671738
generatorByClassName.put(AuthorityAuthorizationDecision.class,
672739
(r) -> new AuthorityAuthorizationDecision(true, AuthorityUtils.createAuthorityList("ROLE_USER")));
740+
RequiredFactor factor = RequiredFactor.withAuthority("authority").validDuration(Duration.ofSeconds(5)).build();
741+
generatorByClassName.put(RequiredFactor.class, (r) -> factor);
742+
RequiredFactorError error = RequiredFactorError.createMissing(factor);
743+
generatorByClassName.put(RequiredFactorError.class, (r) -> error);
744+
generatorByClassName.put(FactorAuthorizationDecision.class,
745+
(r) -> new FactorAuthorizationDecision(List.of(error)));
673746
generatorByClassName.put(CycleInRoleHierarchyException.class, (r) -> new CycleInRoleHierarchyException());
674747
generatorByClassName.put(AuthorizationEvent.class,
675748
(r) -> new AuthorizationEvent(new SerializableSupplier<>(authentication), "source",

0 commit comments

Comments
 (0)