5050import org .springframework .security .web .authentication .rememberme .TokenBasedRememberMeServices ;
5151import org .springframework .security .web .authentication .session .SessionAuthenticationStrategy ;
5252import org .springframework .security .web .firewall .DefaultHttpFirewall ;
53+ import org .springframework .security .web .util .matcher .AntPathRequestMatcher ;
54+ import org .springframework .security .web .util .matcher .RequestMatcher ;
5355import org .springframework .test .util .ReflectionTestUtils ;
5456
5557/**
@@ -212,6 +214,78 @@ public void testNormalOperationWithDefaultFilterProcessesUrl() throws Exception
212214 assertThat (request .getSession ()).isEqualTo (sessionPreAuth );
213215 }
214216
217+ @ Test
218+ public void testNormalOperationWithDefaultFilterProcessesUrlAndAuthenticationManager () throws Exception {
219+ // Setup our HTTP request
220+ MockHttpServletRequest request = createMockAuthenticationRequest ();
221+ HttpSession sessionPreAuth = request .getSession ();
222+
223+ // Setup our filter configuration
224+ MockFilterConfig config = new MockFilterConfig (null , null );
225+
226+ // Setup our expectation that the filter chain will not be invoked, as we redirect
227+ // to defaultTargetUrl
228+ MockFilterChain chain = new MockFilterChain (false );
229+ MockHttpServletResponse response = new MockHttpServletResponse ();
230+
231+ // Setup our test object, to grant access
232+ MockAuthenticationFilter filter = new MockAuthenticationFilter (
233+ "/j_mock_post" , mock (AuthenticationManager .class ));
234+
235+ filter .setSessionAuthenticationStrategy (
236+ mock (SessionAuthenticationStrategy .class ));
237+ filter .setAuthenticationSuccessHandler (successHandler );
238+ filter .setAuthenticationFailureHandler (failureHandler );
239+ filter .afterPropertiesSet ();
240+
241+ // Test
242+ filter .doFilter (request , response , chain );
243+ assertThat (response .getRedirectedUrl ()).isEqualTo ("/mycontext/logged_in.jsp" );
244+ assertThat (SecurityContextHolder .getContext ().getAuthentication ()).isNotNull ();
245+ assertThat (
246+ SecurityContextHolder .getContext ().getAuthentication ().getPrincipal ().toString ()).isEqualTo (
247+ "test" );
248+ // Should still have the same session
249+ assertThat (request .getSession ()).isEqualTo (sessionPreAuth );
250+ }
251+
252+ @ Test
253+ public void testNormalOperationWithRequestMatcherAndAuthenticationManager () throws Exception {
254+ // Setup our HTTP request
255+ MockHttpServletRequest request = createMockAuthenticationRequest ();
256+ request .setServletPath ("/j_eradicate_corona_virus" );
257+ request .setRequestURI ("/mycontext/j_eradicate_corona_virus" );
258+ HttpSession sessionPreAuth = request .getSession ();
259+
260+ // Setup our filter configuration
261+ MockFilterConfig config = new MockFilterConfig (null , null );
262+
263+ // Setup our expectation that the filter chain will not be invoked, as we redirect
264+ // to defaultTargetUrl
265+ MockFilterChain chain = new MockFilterChain (false );
266+ MockHttpServletResponse response = new MockHttpServletResponse ();
267+
268+ // Setup our test object, to grant access
269+ MockAuthenticationFilter filter = new MockAuthenticationFilter (
270+ new AntPathRequestMatcher ("/j_eradicate_corona_virus" ), mock (AuthenticationManager .class ));
271+
272+ filter .setSessionAuthenticationStrategy (
273+ mock (SessionAuthenticationStrategy .class ));
274+ filter .setAuthenticationSuccessHandler (successHandler );
275+ filter .setAuthenticationFailureHandler (failureHandler );
276+ filter .afterPropertiesSet ();
277+
278+ // Test
279+ filter .doFilter (request , response , chain );
280+ assertThat (response .getRedirectedUrl ()).isEqualTo ("/mycontext/logged_in.jsp" );
281+ assertThat (SecurityContextHolder .getContext ().getAuthentication ()).isNotNull ();
282+ assertThat (
283+ SecurityContextHolder .getContext ().getAuthentication ().getPrincipal ().toString ()).isEqualTo (
284+ "test" );
285+ // Should still have the same session
286+ assertThat (request .getSession ()).isEqualTo (sessionPreAuth );
287+ }
288+
215289 @ Test
216290 public void testStartupDetectsInvalidAuthenticationManager () {
217291 AbstractAuthenticationProcessingFilter filter = new MockAuthenticationFilter ();
@@ -430,20 +504,33 @@ public void setRememberMeServicesShouldntAllowNulls() {
430504 private class MockAuthenticationFilter
431505 extends AbstractAuthenticationProcessingFilter {
432506
507+ private static final String DEFAULT_FILTER_PROCESSING_URL = "/j_mock_post" ;
508+
433509 private AuthenticationException exceptionToThrow ;
434510
435511 private boolean grantAccess ;
436512
437513 MockAuthenticationFilter (boolean grantAccess ) {
438514 this ();
439- setRememberMeServices ( new NullRememberMeServices () );
515+ setupRememberMeServicesAndAuthenticationException ( );
440516 this .grantAccess = grantAccess ;
441- this .exceptionToThrow = new BadCredentialsException (
442- "Mock requested to do so" );
443517 }
444518
445519 private MockAuthenticationFilter () {
446- super ("/j_mock_post" );
520+ super (DEFAULT_FILTER_PROCESSING_URL );
521+ }
522+
523+ private MockAuthenticationFilter (String defaultFilterProcessingUrl , AuthenticationManager authenticationManager ) {
524+ super (defaultFilterProcessingUrl , authenticationManager );
525+ setupRememberMeServicesAndAuthenticationException ();
526+ this .grantAccess = true ;
527+ }
528+
529+ private MockAuthenticationFilter (RequestMatcher requiresAuthenticationRequestMatcher ,
530+ AuthenticationManager authenticationManager ) {
531+ super (requiresAuthenticationRequestMatcher , authenticationManager );
532+ setupRememberMeServicesAndAuthenticationException ();
533+ this .grantAccess = true ;
447534 }
448535
449536 public Authentication attemptAuthentication (HttpServletRequest request ,
@@ -456,6 +543,13 @@ public Authentication attemptAuthentication(HttpServletRequest request,
456543 throw exceptionToThrow ;
457544 }
458545 }
546+
547+ private void setupRememberMeServicesAndAuthenticationException () {
548+ setRememberMeServices (new NullRememberMeServices ());
549+ this .exceptionToThrow = new BadCredentialsException (
550+ "Mock requested to do so" );
551+ }
552+
459553 }
460554
461555 private class MockFilterChain implements FilterChain {
0 commit comments