Merge branch '6.4.x'

This commit is contained in:
Josh Cummings 2025-01-23 17:03:53 -07:00
commit e1a42db845
No known key found for this signature in database
GPG Key ID: 869B37A20E876129
16 changed files with 58 additions and 0 deletions

View File

@ -39,11 +39,13 @@ import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import jakarta.servlet.http.Cookie;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apereo.cas.client.validation.AssertionImpl; import org.apereo.cas.client.validation.AssertionImpl;
import org.instancio.Instancio; import org.instancio.Instancio;
@ -58,9 +60,11 @@ import org.junit.jupiter.params.provider.MethodSource;
import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.core.type.filter.AssignableTypeFilter; import org.springframework.core.type.filter.AssignableTypeFilter;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpSession; import org.springframework.mock.web.MockHttpSession;
import org.springframework.security.access.AccessDeniedException; import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.access.AuthorizationServiceException; import org.springframework.security.access.AuthorizationServiceException;
import org.springframework.security.access.SecurityConfig;
import org.springframework.security.access.intercept.RunAsUserToken; import org.springframework.security.access.intercept.RunAsUserToken;
import org.springframework.security.authentication.AbstractAuthenticationToken; import org.springframework.security.authentication.AbstractAuthenticationToken;
import org.springframework.security.authentication.AccountExpiredException; import org.springframework.security.authentication.AccountExpiredException;
@ -104,13 +108,16 @@ import org.springframework.security.core.SpringSecurityCoreVersion;
import org.springframework.security.core.authority.AuthorityUtils; import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextImpl; import org.springframework.security.core.context.SecurityContextImpl;
import org.springframework.security.core.context.TransientSecurityContext;
import org.springframework.security.core.session.AbstractSessionEvent; import org.springframework.security.core.session.AbstractSessionEvent;
import org.springframework.security.core.session.ReactiveSessionInformation; import org.springframework.security.core.session.ReactiveSessionInformation;
import org.springframework.security.core.session.SessionInformation; import org.springframework.security.core.session.SessionInformation;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.ldap.ppolicy.PasswordPolicyControl;
import org.springframework.security.ldap.ppolicy.PasswordPolicyErrorStatus; import org.springframework.security.ldap.ppolicy.PasswordPolicyErrorStatus;
import org.springframework.security.ldap.ppolicy.PasswordPolicyException; import org.springframework.security.ldap.ppolicy.PasswordPolicyException;
import org.springframework.security.ldap.ppolicy.PasswordPolicyResponseControl;
import org.springframework.security.ldap.userdetails.LdapAuthority; import org.springframework.security.ldap.userdetails.LdapAuthority;
import org.springframework.security.oauth2.client.ClientAuthorizationException; import org.springframework.security.oauth2.client.ClientAuthorizationException;
import org.springframework.security.oauth2.client.ClientAuthorizationRequiredException; import org.springframework.security.oauth2.client.ClientAuthorizationRequiredException;
@ -179,6 +186,7 @@ import org.springframework.security.saml2.provider.service.authentication.Saml2R
import org.springframework.security.saml2.provider.service.authentication.TestSaml2Authentications; import org.springframework.security.saml2.provider.service.authentication.TestSaml2Authentications;
import org.springframework.security.saml2.provider.service.authentication.TestSaml2PostAuthenticationRequests; import org.springframework.security.saml2.provider.service.authentication.TestSaml2PostAuthenticationRequests;
import org.springframework.security.saml2.provider.service.authentication.TestSaml2RedirectAuthenticationRequests; import org.springframework.security.saml2.provider.service.authentication.TestSaml2RedirectAuthenticationRequests;
import org.springframework.security.web.PortResolverImpl;
import org.springframework.security.web.authentication.WebAuthenticationDetails; import org.springframework.security.web.authentication.WebAuthenticationDetails;
import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken; import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken;
import org.springframework.security.web.authentication.preauth.PreAuthenticatedCredentialsNotFoundException; import org.springframework.security.web.authentication.preauth.PreAuthenticatedCredentialsNotFoundException;
@ -194,6 +202,8 @@ import org.springframework.security.web.csrf.DefaultCsrfToken;
import org.springframework.security.web.csrf.InvalidCsrfTokenException; import org.springframework.security.web.csrf.InvalidCsrfTokenException;
import org.springframework.security.web.csrf.MissingCsrfTokenException; import org.springframework.security.web.csrf.MissingCsrfTokenException;
import org.springframework.security.web.firewall.RequestRejectedException; import org.springframework.security.web.firewall.RequestRejectedException;
import org.springframework.security.web.savedrequest.DefaultSavedRequest;
import org.springframework.security.web.savedrequest.SimpleSavedRequest;
import org.springframework.security.web.server.firewall.ServerExchangeRejectedException; import org.springframework.security.web.server.firewall.ServerExchangeRejectedException;
import org.springframework.security.web.session.HttpSessionCreatedEvent; import org.springframework.security.web.session.HttpSessionCreatedEvent;
import org.springframework.security.web.webauthn.api.Bytes; import org.springframework.security.web.webauthn.api.Bytes;
@ -442,6 +452,8 @@ class SpringSecurityCoreVersionSerializableTests {
generatorByClassName.put(JaasAuthenticationSuccessEvent.class, generatorByClassName.put(JaasAuthenticationSuccessEvent.class,
(r) -> new JaasAuthenticationSuccessEvent(authentication)); (r) -> new JaasAuthenticationSuccessEvent(authentication));
generatorByClassName.put(AbstractSessionEvent.class, (r) -> new AbstractSessionEvent(securityContext)); generatorByClassName.put(AbstractSessionEvent.class, (r) -> new AbstractSessionEvent(securityContext));
generatorByClassName.put(SecurityConfig.class, (r) -> new SecurityConfig("value"));
generatorByClassName.put(TransientSecurityContext.class, (r) -> new TransientSecurityContext(authentication));
// cas // cas
generatorByClassName.put(CasServiceTicketAuthenticationToken.class, (r) -> { generatorByClassName.put(CasServiceTicketAuthenticationToken.class, (r) -> {
@ -466,6 +478,11 @@ class SpringSecurityCoreVersionSerializableTests {
(r) -> new LdapAuthority("USER", "username", Map.of("attribute", List.of("value1", "value2")))); (r) -> new LdapAuthority("USER", "username", Map.of("attribute", List.of("value1", "value2"))));
generatorByClassName.put(PasswordPolicyException.class, generatorByClassName.put(PasswordPolicyException.class,
(r) -> new PasswordPolicyException(PasswordPolicyErrorStatus.INSUFFICIENT_PASSWORD_QUALITY)); (r) -> new PasswordPolicyException(PasswordPolicyErrorStatus.INSUFFICIENT_PASSWORD_QUALITY));
generatorByClassName.put(PasswordPolicyControl.class, (r) -> new PasswordPolicyControl(true));
generatorByClassName.put(PasswordPolicyResponseControl.class, (r) -> {
byte[] encodedResponse = { 0x30, 0x05, (byte) 0xA0, 0x03, (byte) 0xA0, 0x1, 0x21 };
return new PasswordPolicyResponseControl(encodedResponse);
});
// saml2-service-provider // saml2-service-provider
generatorByClassName.put(Saml2AuthenticationException.class, generatorByClassName.put(Saml2AuthenticationException.class,
@ -521,6 +538,20 @@ class SpringSecurityCoreVersionSerializableTests {
(r) -> new AuthenticationSwitchUserEvent(authentication, user)); (r) -> new AuthenticationSwitchUserEvent(authentication, user));
generatorByClassName.put(HttpSessionCreatedEvent.class, generatorByClassName.put(HttpSessionCreatedEvent.class,
(r) -> new HttpSessionCreatedEvent(new MockHttpSession())); (r) -> new HttpSessionCreatedEvent(new MockHttpSession()));
generatorByClassName.put(SimpleSavedRequest.class, (r) -> {
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/uri");
request.setQueryString("query=string");
request.setScheme("https");
request.setServerName("localhost");
request.setServerPort(80);
request.setRequestURI("/uri");
request.setCookies(new Cookie("name", "value"));
request.addHeader("header", "value");
request.addParameter("parameter", "value");
request.setPathInfo("/path");
request.addPreferredLocale(Locale.ENGLISH);
return new SimpleSavedRequest(new DefaultSavedRequest(request, new PortResolverImpl(), "continue"));
});
// webauthn // webauthn
generatorByClassName.put(Bytes.class, (r) -> TestBytes.get()); generatorByClassName.put(Bytes.class, (r) -> TestBytes.get());

View File

@ -16,6 +16,7 @@
package org.springframework.security.access; package org.springframework.security.access;
import java.io.Serial;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -29,6 +30,9 @@ import org.springframework.util.StringUtils;
*/ */
public class SecurityConfig implements ConfigAttribute { public class SecurityConfig implements ConfigAttribute {
@Serial
private static final long serialVersionUID = -7138084564199804304L;
private final String attrib; private final String attrib;
public SecurityConfig(String config) { public SecurityConfig(String config) {

View File

@ -30,6 +30,7 @@ import org.springframework.security.authorization.method.AuthorizationManagerBef
* @deprecated Use {@link AuthorizationManagerBeforeMethodInterceptor#jsr250()} instead * @deprecated Use {@link AuthorizationManagerBeforeMethodInterceptor#jsr250()} instead
*/ */
@Deprecated @Deprecated
@SuppressWarnings("serial")
public class Jsr250SecurityConfig extends SecurityConfig { public class Jsr250SecurityConfig extends SecurityConfig {
public static final Jsr250SecurityConfig PERMIT_ALL_ATTRIBUTE = new Jsr250SecurityConfig(PermitAll.class.getName()); public static final Jsr250SecurityConfig PERMIT_ALL_ATTRIBUTE = new Jsr250SecurityConfig(PermitAll.class.getName());

View File

@ -28,6 +28,7 @@ import org.springframework.security.access.prepost.PostInvocationAttribute;
* instead * instead
*/ */
@Deprecated @Deprecated
@SuppressWarnings("serial")
class PostInvocationExpressionAttribute extends AbstractExpressionBasedMethodConfigAttribute class PostInvocationExpressionAttribute extends AbstractExpressionBasedMethodConfigAttribute
implements PostInvocationAttribute { implements PostInvocationAttribute {

View File

@ -28,6 +28,7 @@ import org.springframework.security.access.prepost.PreInvocationAttribute;
* instead * instead
*/ */
@Deprecated @Deprecated
@SuppressWarnings("serial")
class PreInvocationExpressionAttribute extends AbstractExpressionBasedMethodConfigAttribute class PreInvocationExpressionAttribute extends AbstractExpressionBasedMethodConfigAttribute
implements PreInvocationAttribute { implements PreInvocationAttribute {

View File

@ -54,6 +54,7 @@ import org.springframework.util.CollectionUtils;
* @deprecated Use {@link EnableMethodSecurity} or publish interceptors directly * @deprecated Use {@link EnableMethodSecurity} or publish interceptors directly
*/ */
@Deprecated @Deprecated
@SuppressWarnings("serial")
public class MethodSecurityMetadataSourceAdvisor extends AbstractPointcutAdvisor implements BeanFactoryAware { public class MethodSecurityMetadataSourceAdvisor extends AbstractPointcutAdvisor implements BeanFactoryAware {
private transient MethodSecurityMetadataSource attributeSource; private transient MethodSecurityMetadataSource attributeSource;

View File

@ -405,6 +405,7 @@ class ComparableVersion implements Comparable<ComparableVersion> {
* Represents a version list item. This class is used both for the global item list * Represents a version list item. This class is used both for the global item list
* and for sub-lists (which start with '-(number)' in the version specification). * and for sub-lists (which start with '-(number)' in the version specification).
*/ */
@SuppressWarnings("serial")
private static class ListItem extends ArrayList<Item> implements Item { private static class ListItem extends ArrayList<Item> implements Item {
@Override @Override

View File

@ -16,6 +16,8 @@
package org.springframework.security.core.context; package org.springframework.security.core.context;
import java.io.Serial;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.core.Transient; import org.springframework.security.core.Transient;
@ -30,6 +32,9 @@ import org.springframework.security.core.Transient;
@Transient @Transient
public class TransientSecurityContext extends SecurityContextImpl { public class TransientSecurityContext extends SecurityContextImpl {
@Serial
private static final long serialVersionUID = -7925492364422193347L;
public TransientSecurityContext() { public TransientSecurityContext() {
} }

View File

@ -16,6 +16,8 @@
package org.springframework.security.ldap.ppolicy; package org.springframework.security.ldap.ppolicy;
import java.io.Serial;
import javax.naming.ldap.Control; import javax.naming.ldap.Control;
/** /**
@ -37,6 +39,9 @@ public class PasswordPolicyControl implements Control {
*/ */
public static final String OID = "1.3.6.1.4.1.42.2.27.8.5.1"; public static final String OID = "1.3.6.1.4.1.42.2.27.8.5.1";
@Serial
private static final long serialVersionUID = 2843242715616817932L;
private final boolean critical; private final boolean critical;
/** /**

View File

@ -19,6 +19,7 @@ package org.springframework.security.ldap.ppolicy;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.Serial;
import netscape.ldap.ber.stream.BERChoice; import netscape.ldap.ber.stream.BERChoice;
import netscape.ldap.ber.stream.BERElement; import netscape.ldap.ber.stream.BERElement;
@ -53,6 +54,9 @@ public class PasswordPolicyResponseControl extends PasswordPolicyControl {
private static final Log logger = LogFactory.getLog(PasswordPolicyResponseControl.class); private static final Log logger = LogFactory.getLog(PasswordPolicyResponseControl.class);
@Serial
private static final long serialVersionUID = -4592657167939234499L;
private final byte[] encodedValue; private final byte[] encodedValue;
private PasswordPolicyErrorStatus errorStatus; private PasswordPolicyErrorStatus errorStatus;

View File

@ -16,6 +16,7 @@
package org.springframework.security.web.savedrequest; package org.springframework.security.web.savedrequest;
import java.io.Serial;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
@ -35,6 +36,9 @@ import org.springframework.util.Assert;
*/ */
public class SimpleSavedRequest implements SavedRequest { public class SimpleSavedRequest implements SavedRequest {
@Serial
private static final long serialVersionUID = 807650604272166969L;
private String redirectUrl; private String redirectUrl;
private List<Cookie> cookies = new ArrayList<>(); private List<Cookie> cookies = new ArrayList<>();