Fix Serializable tests

Issue gh-17880
This commit is contained in:
Joe Grandja 2025-09-10 07:58:53 -04:00
parent cc71be71e5
commit 8399bc161d
28 changed files with 171 additions and 0 deletions

View File

@ -19,6 +19,7 @@ package org.springframework.security;
import java.io.IOException;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.security.Principal;
import java.time.Instant;
import java.util.Collection;
import java.util.Date;
@ -122,6 +123,8 @@ import org.springframework.security.oauth2.client.oidc.session.OidcSessionInform
import org.springframework.security.oauth2.client.oidc.session.TestOidcSessionInformations;
import org.springframework.security.oauth2.client.registration.ClientRegistration;
import org.springframework.security.oauth2.client.registration.TestClientRegistrations;
import org.springframework.security.oauth2.core.AuthorizationGrantType;
import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
import org.springframework.security.oauth2.core.DefaultOAuth2AuthenticatedPrincipal;
import org.springframework.security.oauth2.core.OAuth2AccessToken;
import org.springframework.security.oauth2.core.OAuth2AuthenticatedPrincipal;
@ -156,6 +159,34 @@ import org.springframework.security.oauth2.jwt.JwtEncodingException;
import org.springframework.security.oauth2.jwt.JwtException;
import org.springframework.security.oauth2.jwt.JwtValidationException;
import org.springframework.security.oauth2.jwt.TestJwts;
import org.springframework.security.oauth2.server.authorization.OAuth2Authorization;
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationConsent;
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationServerMetadata;
import org.springframework.security.oauth2.server.authorization.OAuth2TokenIntrospection;
import org.springframework.security.oauth2.server.authorization.OAuth2TokenType;
import org.springframework.security.oauth2.server.authorization.TestOAuth2Authorizations;
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AccessTokenAuthenticationToken;
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationCodeRequestAuthenticationToken;
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationConsentAuthenticationToken;
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationGrantAuthenticationToken;
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientAuthenticationToken;
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2DeviceAuthorizationConsentAuthenticationToken;
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2DeviceAuthorizationRequestAuthenticationToken;
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2DeviceVerificationAuthenticationToken;
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2PushedAuthorizationRequestAuthenticationToken;
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2TokenIntrospectionAuthenticationToken;
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2TokenRevocationAuthenticationToken;
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients;
import org.springframework.security.oauth2.server.authorization.oidc.OidcClientRegistration;
import org.springframework.security.oauth2.server.authorization.oidc.OidcProviderConfiguration;
import org.springframework.security.oauth2.server.authorization.oidc.authentication.OidcClientRegistrationAuthenticationToken;
import org.springframework.security.oauth2.server.authorization.oidc.authentication.OidcLogoutAuthenticationToken;
import org.springframework.security.oauth2.server.authorization.oidc.authentication.OidcUserInfoAuthenticationToken;
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
import org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat;
import org.springframework.security.oauth2.server.authorization.settings.TokenSettings;
import org.springframework.security.oauth2.server.resource.BearerTokenError;
import org.springframework.security.oauth2.server.resource.BearerTokenErrors;
import org.springframework.security.oauth2.server.resource.InvalidBearerTokenException;
@ -374,6 +405,146 @@ final class SerializationSamples {
generatorByClassName.put(DPoPAuthenticationToken.class,
(r) -> applyDetails(new DPoPAuthenticationToken("token", "proof", "method", "uri")));
// oauth2-authorization-server
RegisteredClient registeredClient = TestRegisteredClients.registeredClient().build();
OAuth2Authorization authorization = TestOAuth2Authorizations.authorization(registeredClient).build();
OAuth2AuthorizationRequest authorizationRequest = authorization
.getAttribute(OAuth2AuthorizationRequest.class.getName());
Authentication principal = authorization.getAttribute(Principal.class.getName());
generatorByClassName.put(RegisteredClient.class, (r) -> registeredClient);
generatorByClassName.put(OAuth2Authorization.class, (r) -> authorization);
generatorByClassName.put(OAuth2Authorization.Token.class, (r) -> authorization.getAccessToken());
generatorByClassName.put(OAuth2AuthorizationConsent.class,
(r) -> OAuth2AuthorizationConsent.withId("registeredClientId", "principalName")
.scope("scope1")
.scope("scope2")
.build());
generatorByClassName.put(OAuth2AuthorizationCodeRequestAuthenticationToken.class, (r) -> {
OAuth2AuthorizationCodeRequestAuthenticationToken authenticationToken = new OAuth2AuthorizationCodeRequestAuthenticationToken(
"authorizationUri", "clientId", principal, "redirectUri", "state", authorizationRequest.getScopes(),
authorizationRequest.getAdditionalParameters());
authenticationToken.setDetails(details);
return authenticationToken;
});
generatorByClassName.put(OAuth2PushedAuthorizationRequestAuthenticationToken.class, (r) -> {
OAuth2PushedAuthorizationRequestAuthenticationToken authenticationToken = new OAuth2PushedAuthorizationRequestAuthenticationToken(
"authorizationUri", "clientId", principal, "redirectUri", "state", authorizationRequest.getScopes(),
authorizationRequest.getAdditionalParameters());
authenticationToken.setDetails(details);
return authenticationToken;
});
generatorByClassName.put(OAuth2AuthorizationGrantAuthenticationToken.class, (r) -> {
org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationCodeAuthenticationToken authenticationToken = new org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationCodeAuthenticationToken(
"code", principal, "redirectUri", new HashMap<>());
authenticationToken.setDetails(details);
return authenticationToken;
});
generatorByClassName.put(OAuth2AuthorizationConsentAuthenticationToken.class, (r) -> {
OAuth2AuthorizationConsentAuthenticationToken authenticationToken = new OAuth2AuthorizationConsentAuthenticationToken(
"authorizationUri", "clientId", principal, "state", authorizationRequest.getScopes(),
authorizationRequest.getAdditionalParameters());
authenticationToken.setDetails(details);
return authenticationToken;
});
generatorByClassName.put(OAuth2DeviceAuthorizationRequestAuthenticationToken.class, (r) -> {
OAuth2DeviceAuthorizationRequestAuthenticationToken authenticationToken = new OAuth2DeviceAuthorizationRequestAuthenticationToken(
principal, "authorizationUri", authorizationRequest.getScopes(),
authorizationRequest.getAdditionalParameters());
authenticationToken.setDetails(details);
return authenticationToken;
});
generatorByClassName.put(OAuth2DeviceAuthorizationConsentAuthenticationToken.class, (r) -> {
OAuth2DeviceAuthorizationConsentAuthenticationToken authenticationToken = new OAuth2DeviceAuthorizationConsentAuthenticationToken(
"authorizationUri", "clientId", principal, "userCode", "state", authorizationRequest.getScopes(),
authorizationRequest.getAdditionalParameters());
authenticationToken.setDetails(details);
return authenticationToken;
});
generatorByClassName.put(OAuth2DeviceVerificationAuthenticationToken.class, (r) -> {
OAuth2DeviceVerificationAuthenticationToken authenticationToken = new OAuth2DeviceVerificationAuthenticationToken(
principal, "userCode", new HashMap<>());
authenticationToken.setDetails(details);
return authenticationToken;
});
generatorByClassName.put(OAuth2TokenIntrospectionAuthenticationToken.class, (r) -> {
OAuth2TokenIntrospectionAuthenticationToken authenticationToken = new OAuth2TokenIntrospectionAuthenticationToken(
"token", principal, "tokenTypeHint", new HashMap<>());
authenticationToken.setDetails(details);
return authenticationToken;
});
generatorByClassName.put(OAuth2TokenRevocationAuthenticationToken.class, (r) -> {
OAuth2TokenRevocationAuthenticationToken authenticationToken = new OAuth2TokenRevocationAuthenticationToken(
"token", principal, "tokenTypeHint");
authenticationToken.setDetails(details);
return authenticationToken;
});
OidcClientRegistration oidcClientRegistration = OidcClientRegistration.builder()
.grantType(AuthorizationGrantType.AUTHORIZATION_CODE.getValue())
.scope("scope1")
.redirectUri("https://localhost/oauth2/callback")
.build();
generatorByClassName.put(OidcClientRegistration.class, (r) -> oidcClientRegistration);
generatorByClassName.put(OidcClientRegistrationAuthenticationToken.class, (r) -> {
OidcClientRegistrationAuthenticationToken authenticationToken = new OidcClientRegistrationAuthenticationToken(
principal, oidcClientRegistration);
authenticationToken.setDetails(details);
return authenticationToken;
});
generatorByClassName.put(OidcUserInfoAuthenticationToken.class, (r) -> {
OidcUserInfo userInfo = OidcUserInfo.builder().subject("subject").name("name").build();
OidcUserInfoAuthenticationToken authenticationToken = new OidcUserInfoAuthenticationToken(principal,
userInfo);
authenticationToken.setDetails(details);
return authenticationToken;
});
generatorByClassName.put(OidcLogoutAuthenticationToken.class, (r) -> {
OidcIdToken idToken = OidcIdToken.withTokenValue("tokenValue")
.issuedAt(Instant.now())
.expiresAt(Instant.now().plusSeconds(60))
.build();
OidcLogoutAuthenticationToken authenticationToken = new OidcLogoutAuthenticationToken(idToken, principal,
"sessionId", "clientId", "postLogoutRedirectUri", "state");
authenticationToken.setDetails(details);
return authenticationToken;
});
generatorByClassName.put(OAuth2ClientAuthenticationToken.class, (r) -> {
OAuth2ClientAuthenticationToken authenticationToken = new OAuth2ClientAuthenticationToken(registeredClient,
ClientAuthenticationMethod.CLIENT_SECRET_BASIC, "credentials");
authenticationToken.setDetails(details);
return authenticationToken;
});
generatorByClassName.put(OAuth2TokenIntrospection.class,
(r) -> OAuth2TokenIntrospection.builder().active(true).clientId("clientId").build());
generatorByClassName.put(OAuth2AccessTokenAuthenticationToken.class, (r) -> {
OAuth2AccessTokenAuthenticationToken authenticationToken = new OAuth2AccessTokenAuthenticationToken(
registeredClient, principal, authorization.getAccessToken().getToken());
authenticationToken.setDetails(details);
return authenticationToken;
});
generatorByClassName.put(OAuth2AuthorizationServerMetadata.class,
(r) -> OAuth2AuthorizationServerMetadata.builder()
.issuer("https://localhost")
.authorizationEndpoint("https://localhost/oauth2/authorize")
.tokenEndpoint("https://localhost/oauth2/token")
.responseType("code")
.build());
generatorByClassName.put(OidcProviderConfiguration.class,
(r) -> OidcProviderConfiguration.builder()
.issuer("https://localhost")
.authorizationEndpoint("https://localhost/oauth2/authorize")
.tokenEndpoint("https://localhost/oauth2/token")
.jwkSetUrl("https://localhost/oauth2/jwks")
.responseType("code")
.subjectType("subjectType")
.idTokenSigningAlgorithm("RS256")
.build());
generatorByClassName.put(OAuth2TokenType.class, (r) -> OAuth2TokenType.ACCESS_TOKEN);
generatorByClassName.put(OAuth2TokenFormat.class, (r) -> OAuth2TokenFormat.SELF_CONTAINED);
generatorByClassName.put(AuthorizationServerSettings.class,
(r) -> AuthorizationServerSettings.builder().build());
generatorByClassName.put(ClientSettings.class, (r) -> ClientSettings.builder().build());
generatorByClassName.put(TokenSettings.class, (r) -> TokenSettings.builder().build());
// config
generatorByClassName.put(AlreadyBuiltException.class, (r) -> new AlreadyBuiltException("message"));