diff --git a/oauth2/oauth2-core/src/main/java/org/springframework/security/oauth2/core/endpoint/OAuth2AuthorizationRequest.java b/oauth2/oauth2-core/src/main/java/org/springframework/security/oauth2/core/endpoint/OAuth2AuthorizationRequest.java index ff40a307858..0147b0f4f44 100644 --- a/oauth2/oauth2-core/src/main/java/org/springframework/security/oauth2/core/endpoint/OAuth2AuthorizationRequest.java +++ b/oauth2/oauth2-core/src/main/java/org/springframework/security/oauth2/core/endpoint/OAuth2AuthorizationRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,7 @@ import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.function.Consumer; import java.util.function.Function; @@ -188,6 +189,35 @@ public static Builder authorizationCode() { return new Builder(AuthorizationGrantType.AUTHORIZATION_CODE); } + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || this.getClass() != obj.getClass()) { + return false; + } + OAuth2AuthorizationRequest that = (OAuth2AuthorizationRequest) obj; + + return Objects.equals(this.authorizationUri, that.authorizationUri) + && Objects.equals(this.authorizationGrantType, that.authorizationGrantType) + && Objects.equals(this.responseType, that.responseType) && Objects.equals(this.clientId, that.clientId) + && Objects.equals(this.redirectUri, that.redirectUri) && Objects.equals(this.scopes, that.scopes) + && Objects.equals(this.state, that.state) + && Objects.equals(this.additionalParameters, that.additionalParameters) + && Objects.equals(this.authorizationRequestUri, that.authorizationRequestUri) + && Objects.equals(this.attributes, that.attributes); + } + + @Override + public int hashCode() { + return Objects.hashCode(this.authorizationUri) + Objects.hashCode(this.clientId) + + Objects.hashCode(this.authorizationGrantType) + Objects.hashCode(this.responseType) + + Objects.hashCode(this.redirectUri) + Objects.hashCode(this.scopes) + Objects.hashCode(this.state) + + Objects.hashCode(this.additionalParameters) + Objects.hashCode(this.authorizationRequestUri) + + Objects.hashCode(this.attributes); + } + /** * Returns a new {@link Builder}, initialized with the values from the provided * {@code authorizationRequest}. diff --git a/oauth2/oauth2-core/src/test/java/org/springframework/security/oauth2/core/endpoint/OAuth2AuthorizationRequestTests.java b/oauth2/oauth2-core/src/test/java/org/springframework/security/oauth2/core/endpoint/OAuth2AuthorizationRequestTests.java index 1c4365560d8..106c57c0b1a 100644 --- a/oauth2/oauth2-core/src/test/java/org/springframework/security/oauth2/core/endpoint/OAuth2AuthorizationRequestTests.java +++ b/oauth2/oauth2-core/src/test/java/org/springframework/security/oauth2/core/endpoint/OAuth2AuthorizationRequestTests.java @@ -18,6 +18,7 @@ import java.net.URI; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedHashSet; @@ -28,8 +29,7 @@ import org.springframework.security.oauth2.core.AuthorizationGrantType; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +import static org.assertj.core.api.Assertions.*; /** * Tests for {@link OAuth2AuthorizationRequest}. @@ -365,4 +365,49 @@ public void buildWhenAdditionalParametersContainsNullThenAuthorizationRequestUri + "item1=null&item2=value2"); } + @Test + public void equalsTrueTest() { + OAuth2AuthorizationRequest authorizationRequest1 = TestOAuth2AuthorizationRequests.request() + .authorizationRequestUri("https://example.com") + .additionalParameters( + Collections.singletonMap("someAdditionalParameterKey", "someAdditionalParameterValue")) + .parameters((parametersMap) -> parametersMap.put("someParameterKey", "someParameterValue")) + .scope("someScope") + .build(); + + OAuth2AuthorizationRequest authorizationRequest2 = TestOAuth2AuthorizationRequests.request() + .authorizationRequestUri("https://example.com") + .additionalParameters( + Collections.singletonMap("someAdditionalParameterKey", "someAdditionalParameterValue")) + .parameters((parametersMap) -> parametersMap.put("someParameterKey", "someParameterValue")) + .scope("someScope") + .build(); + + assertThat(authorizationRequest1).isEqualTo(authorizationRequest2); + } + + @Test + public void hashCodeTest() { + OAuth2AuthorizationRequest authorizationRequest1 = TestOAuth2AuthorizationRequests.request() + .authorizationRequestUri("https://example.com") + .additionalParameters( + Collections.singletonMap("someAdditionalParameterKey", "someAdditionalParameterValue")) + .parameters((parametersMap) -> parametersMap.put("someParameterKey", "someParameterValue")) + .scope("someScope") + .build(); + + OAuth2AuthorizationRequest authorizationRequest2 = TestOAuth2AuthorizationRequests.request() + .authorizationRequestUri("https://example.com") + .additionalParameters( + Collections.singletonMap("someAdditionalParameterKey", "someAdditionalParameterValue")) + .parameters((parametersMap) -> parametersMap.put("someParameterKey", "someParameterValue")) + .scope("someScope") + .build(); + + int authorizationRequest1HashCode = authorizationRequest1.hashCode(); + int authorizationRequest2HashCode = authorizationRequest2.hashCode(); + + assertThat(authorizationRequest1HashCode).isEqualTo(authorizationRequest2HashCode); + } + }