|
|
|
@ -16,7 +16,9 @@ |
|
|
|
|
|
|
|
|
|
|
|
package org.springframework.security.web.authentication; |
|
|
|
package org.springframework.security.web.authentication; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import java.util.Collections; |
|
|
|
import java.util.LinkedHashMap; |
|
|
|
import java.util.LinkedHashMap; |
|
|
|
|
|
|
|
import java.util.List; |
|
|
|
|
|
|
|
|
|
|
|
import jakarta.servlet.http.HttpServletRequest; |
|
|
|
import jakarta.servlet.http.HttpServletRequest; |
|
|
|
import org.junit.jupiter.api.BeforeEach; |
|
|
|
import org.junit.jupiter.api.BeforeEach; |
|
|
|
@ -25,7 +27,9 @@ import org.junit.jupiter.api.Test; |
|
|
|
import org.springframework.mock.web.MockHttpServletRequest; |
|
|
|
import org.springframework.mock.web.MockHttpServletRequest; |
|
|
|
import org.springframework.security.web.AuthenticationEntryPoint; |
|
|
|
import org.springframework.security.web.AuthenticationEntryPoint; |
|
|
|
import org.springframework.security.web.util.matcher.RequestMatcher; |
|
|
|
import org.springframework.security.web.util.matcher.RequestMatcher; |
|
|
|
|
|
|
|
import org.springframework.security.web.util.matcher.RequestMatcherEntry; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; |
|
|
|
import static org.mockito.BDDMockito.given; |
|
|
|
import static org.mockito.BDDMockito.given; |
|
|
|
import static org.mockito.Mockito.mock; |
|
|
|
import static org.mockito.Mockito.mock; |
|
|
|
import static org.mockito.Mockito.never; |
|
|
|
import static org.mockito.Mockito.never; |
|
|
|
@ -52,8 +56,6 @@ public class DelegatingAuthenticationEntryPointTests { |
|
|
|
public void before() { |
|
|
|
public void before() { |
|
|
|
this.defaultEntryPoint = mock(AuthenticationEntryPoint.class); |
|
|
|
this.defaultEntryPoint = mock(AuthenticationEntryPoint.class); |
|
|
|
this.entryPoints = new LinkedHashMap<>(); |
|
|
|
this.entryPoints = new LinkedHashMap<>(); |
|
|
|
this.daep = new DelegatingAuthenticationEntryPoint(this.entryPoints); |
|
|
|
|
|
|
|
this.daep.setDefaultEntryPoint(this.defaultEntryPoint); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
@ -62,6 +64,8 @@ public class DelegatingAuthenticationEntryPointTests { |
|
|
|
RequestMatcher firstRM = mock(RequestMatcher.class); |
|
|
|
RequestMatcher firstRM = mock(RequestMatcher.class); |
|
|
|
given(firstRM.matches(this.request)).willReturn(false); |
|
|
|
given(firstRM.matches(this.request)).willReturn(false); |
|
|
|
this.entryPoints.put(firstRM, firstAEP); |
|
|
|
this.entryPoints.put(firstRM, firstAEP); |
|
|
|
|
|
|
|
this.daep = new DelegatingAuthenticationEntryPoint(this.entryPoints); |
|
|
|
|
|
|
|
this.daep.setDefaultEntryPoint(this.defaultEntryPoint); |
|
|
|
this.daep.commence(this.request, null, null); |
|
|
|
this.daep.commence(this.request, null, null); |
|
|
|
verify(this.defaultEntryPoint).commence(this.request, null, null); |
|
|
|
verify(this.defaultEntryPoint).commence(this.request, null, null); |
|
|
|
verify(firstAEP, never()).commence(this.request, null, null); |
|
|
|
verify(firstAEP, never()).commence(this.request, null, null); |
|
|
|
@ -76,6 +80,8 @@ public class DelegatingAuthenticationEntryPointTests { |
|
|
|
given(firstRM.matches(this.request)).willReturn(true); |
|
|
|
given(firstRM.matches(this.request)).willReturn(true); |
|
|
|
this.entryPoints.put(firstRM, firstAEP); |
|
|
|
this.entryPoints.put(firstRM, firstAEP); |
|
|
|
this.entryPoints.put(secondRM, secondAEP); |
|
|
|
this.entryPoints.put(secondRM, secondAEP); |
|
|
|
|
|
|
|
this.daep = new DelegatingAuthenticationEntryPoint(this.entryPoints); |
|
|
|
|
|
|
|
this.daep.setDefaultEntryPoint(this.defaultEntryPoint); |
|
|
|
this.daep.commence(this.request, null, null); |
|
|
|
this.daep.commence(this.request, null, null); |
|
|
|
verify(firstAEP).commence(this.request, null, null); |
|
|
|
verify(firstAEP).commence(this.request, null, null); |
|
|
|
verify(secondAEP, never()).commence(this.request, null, null); |
|
|
|
verify(secondAEP, never()).commence(this.request, null, null); |
|
|
|
@ -93,6 +99,103 @@ public class DelegatingAuthenticationEntryPointTests { |
|
|
|
given(secondRM.matches(this.request)).willReturn(true); |
|
|
|
given(secondRM.matches(this.request)).willReturn(true); |
|
|
|
this.entryPoints.put(firstRM, firstAEP); |
|
|
|
this.entryPoints.put(firstRM, firstAEP); |
|
|
|
this.entryPoints.put(secondRM, secondAEP); |
|
|
|
this.entryPoints.put(secondRM, secondAEP); |
|
|
|
|
|
|
|
this.daep = new DelegatingAuthenticationEntryPoint(this.entryPoints); |
|
|
|
|
|
|
|
this.daep.setDefaultEntryPoint(this.defaultEntryPoint); |
|
|
|
|
|
|
|
this.daep.commence(this.request, null, null); |
|
|
|
|
|
|
|
verify(secondAEP).commence(this.request, null, null); |
|
|
|
|
|
|
|
verify(firstAEP, never()).commence(this.request, null, null); |
|
|
|
|
|
|
|
verify(this.defaultEntryPoint, never()).commence(this.request, null, null); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
public void constructorAepListWhenNullEntryPoints() { |
|
|
|
|
|
|
|
List<RequestMatcherEntry<AuthenticationEntryPoint>> entryPoints = null; |
|
|
|
|
|
|
|
assertThatIllegalArgumentException().isThrownBy( |
|
|
|
|
|
|
|
() -> new DelegatingAuthenticationEntryPoint(mock(AuthenticationEntryPoint.class), entryPoints)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
public void constructorAepListWhenEmptyEntryPoints() { |
|
|
|
|
|
|
|
assertThatIllegalArgumentException() |
|
|
|
|
|
|
|
.isThrownBy(() -> new DelegatingAuthenticationEntryPoint(mock(AuthenticationEntryPoint.class), |
|
|
|
|
|
|
|
Collections.emptyList())); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
public void constructorAepListWhenNullDefaultEntryPoint() { |
|
|
|
|
|
|
|
AuthenticationEntryPoint entryPoint = mock(AuthenticationEntryPoint.class); |
|
|
|
|
|
|
|
RequestMatcher matcher = mock(RequestMatcher.class); |
|
|
|
|
|
|
|
List<RequestMatcherEntry<AuthenticationEntryPoint>> entryPoints = List |
|
|
|
|
|
|
|
.of(new RequestMatcherEntry<>(matcher, entryPoint)); |
|
|
|
|
|
|
|
assertThatIllegalArgumentException() |
|
|
|
|
|
|
|
.isThrownBy(() -> new DelegatingAuthenticationEntryPoint(null, entryPoints)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
public void constructorAepVargsWhenNullEntryPoints() { |
|
|
|
|
|
|
|
RequestMatcherEntry<AuthenticationEntryPoint>[] entryPoints = null; |
|
|
|
|
|
|
|
assertThatIllegalArgumentException().isThrownBy( |
|
|
|
|
|
|
|
() -> new DelegatingAuthenticationEntryPoint(mock(AuthenticationEntryPoint.class), entryPoints)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
public void constructorAepVargsWhenEmptyEntryPoints() { |
|
|
|
|
|
|
|
RequestMatcherEntry<AuthenticationEntryPoint>[] entryPoints = new RequestMatcherEntry[0]; |
|
|
|
|
|
|
|
assertThatIllegalArgumentException().isThrownBy( |
|
|
|
|
|
|
|
() -> new DelegatingAuthenticationEntryPoint(mock(AuthenticationEntryPoint.class), entryPoints)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
public void constructorAepVargsWhenNullDefaultEntryPoint() { |
|
|
|
|
|
|
|
AuthenticationEntryPoint entryPoint = mock(AuthenticationEntryPoint.class); |
|
|
|
|
|
|
|
RequestMatcher matcher = mock(RequestMatcher.class); |
|
|
|
|
|
|
|
RequestMatcherEntry<AuthenticationEntryPoint>[] entryPoints = new RequestMatcherEntry[] { |
|
|
|
|
|
|
|
new RequestMatcherEntry<>(matcher, entryPoint) }; |
|
|
|
|
|
|
|
assertThatIllegalArgumentException() |
|
|
|
|
|
|
|
.isThrownBy(() -> new DelegatingAuthenticationEntryPoint(null, entryPoints)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
public void commenceWhenNoMatchThenDefaultEntryPoint() throws Exception { |
|
|
|
|
|
|
|
AuthenticationEntryPoint firstAEP = mock(AuthenticationEntryPoint.class); |
|
|
|
|
|
|
|
RequestMatcher firstRM = mock(RequestMatcher.class); |
|
|
|
|
|
|
|
given(firstRM.matches(this.request)).willReturn(false); |
|
|
|
|
|
|
|
RequestMatcherEntry<AuthenticationEntryPoint> entry = new RequestMatcherEntry<>(firstRM, firstAEP); |
|
|
|
|
|
|
|
this.daep = new DelegatingAuthenticationEntryPoint(this.defaultEntryPoint, entry); |
|
|
|
|
|
|
|
this.daep.commence(this.request, null, null); |
|
|
|
|
|
|
|
verify(this.defaultEntryPoint).commence(this.request, null, null); |
|
|
|
|
|
|
|
verify(firstAEP, never()).commence(this.request, null, null); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
public void commenceWhenMatchFirstEntryPointThenOthersNotInvoked() throws Exception { |
|
|
|
|
|
|
|
AuthenticationEntryPoint firstAEP = mock(AuthenticationEntryPoint.class); |
|
|
|
|
|
|
|
RequestMatcher firstRM = mock(RequestMatcher.class); |
|
|
|
|
|
|
|
given(firstRM.matches(this.request)).willReturn(true); |
|
|
|
|
|
|
|
RequestMatcherEntry<AuthenticationEntryPoint> firstEntry = new RequestMatcherEntry<>(firstRM, firstAEP); |
|
|
|
|
|
|
|
AuthenticationEntryPoint secondAEP = mock(AuthenticationEntryPoint.class); |
|
|
|
|
|
|
|
RequestMatcher secondRM = mock(RequestMatcher.class); |
|
|
|
|
|
|
|
given(secondRM.matches(this.request)).willReturn(false); |
|
|
|
|
|
|
|
RequestMatcherEntry<AuthenticationEntryPoint> secondEntry = new RequestMatcherEntry<>(firstRM, firstAEP); |
|
|
|
|
|
|
|
this.daep = new DelegatingAuthenticationEntryPoint(this.defaultEntryPoint, firstEntry, secondEntry); |
|
|
|
|
|
|
|
this.daep.commence(this.request, null, null); |
|
|
|
|
|
|
|
verify(firstAEP).commence(this.request, null, null); |
|
|
|
|
|
|
|
verify(secondAEP, never()).commence(this.request, null, null); |
|
|
|
|
|
|
|
verify(this.defaultEntryPoint, never()).commence(this.request, null, null); |
|
|
|
|
|
|
|
verify(secondRM, never()).matches(this.request); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
public void commenceWhenSecondMatchesThenDefaultNotInvoked() throws Exception { |
|
|
|
|
|
|
|
AuthenticationEntryPoint firstAEP = mock(AuthenticationEntryPoint.class); |
|
|
|
|
|
|
|
RequestMatcher firstRM = mock(RequestMatcher.class); |
|
|
|
|
|
|
|
given(firstRM.matches(this.request)).willReturn(false); |
|
|
|
|
|
|
|
RequestMatcherEntry<AuthenticationEntryPoint> firstEntry = new RequestMatcherEntry<>(firstRM, firstAEP); |
|
|
|
|
|
|
|
AuthenticationEntryPoint secondAEP = mock(AuthenticationEntryPoint.class); |
|
|
|
|
|
|
|
RequestMatcher secondRM = mock(RequestMatcher.class); |
|
|
|
|
|
|
|
given(secondRM.matches(this.request)).willReturn(true); |
|
|
|
|
|
|
|
RequestMatcherEntry<AuthenticationEntryPoint> secondEntry = new RequestMatcherEntry<>(secondRM, secondAEP); |
|
|
|
|
|
|
|
this.daep = new DelegatingAuthenticationEntryPoint(this.defaultEntryPoint, firstEntry, secondEntry); |
|
|
|
this.daep.commence(this.request, null, null); |
|
|
|
this.daep.commence(this.request, null, null); |
|
|
|
verify(secondAEP).commence(this.request, null, null); |
|
|
|
verify(secondAEP).commence(this.request, null, null); |
|
|
|
verify(firstAEP, never()).commence(this.request, null, null); |
|
|
|
verify(firstAEP, never()).commence(this.request, null, null); |
|
|
|
|