@ -34,6 +34,7 @@ import org.springframework.security.core.AuthenticationException;
@@ -34,6 +34,7 @@ import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.context.SecurityContextHolder ;
import org.springframework.security.web.WebAttributes ;
import org.springframework.security.web.authentication.* ;
import org.springframework.security.web.util.matcher.RequestMatcher ;
import org.springframework.util.Assert ;
import org.springframework.web.filter.GenericFilterBean ;
@ -73,6 +74,7 @@ import org.springframework.web.filter.GenericFilterBean;
@@ -73,6 +74,7 @@ import org.springframework.web.filter.GenericFilterBean;
* @author Luke Taylor
* @author Ruud Senden
* @author Rob Winch
* @author Tadaya Tsuyukubo
* @since 2 . 0
* /
public abstract class AbstractPreAuthenticatedProcessingFilter extends GenericFilterBean
@ -86,6 +88,7 @@ public abstract class AbstractPreAuthenticatedProcessingFilter extends GenericFi
@@ -86,6 +88,7 @@ public abstract class AbstractPreAuthenticatedProcessingFilter extends GenericFi
private boolean invalidateSessionOnPrincipalChange = true ;
private AuthenticationSuccessHandler authenticationSuccessHandler = null ;
private AuthenticationFailureHandler authenticationFailureHandler = null ;
private RequestMatcher requiresAuthenticationRequestMatcher = new PreAuthenticatedProcessingRequestMatcher ( ) ;
/ * *
* Check whether all required properties have been set .
@ -114,7 +117,7 @@ public abstract class AbstractPreAuthenticatedProcessingFilter extends GenericFi
@@ -114,7 +117,7 @@ public abstract class AbstractPreAuthenticatedProcessingFilter extends GenericFi
+ SecurityContextHolder . getContext ( ) . getAuthentication ( ) ) ;
}
if ( requiresAuthentication ( ( HttpServletRequest ) request ) ) {
if ( requiresAuthenticationRequestMatcher . matches ( ( HttpServletRequest ) request ) ) {
doAuthenticate ( ( HttpServletRequest ) request , ( HttpServletResponse ) response ) ;
}
@ -193,39 +196,6 @@ public abstract class AbstractPreAuthenticatedProcessingFilter extends GenericFi
@@ -193,39 +196,6 @@ public abstract class AbstractPreAuthenticatedProcessingFilter extends GenericFi
}
}
private boolean requiresAuthentication ( HttpServletRequest request ) {
Authentication currentUser = SecurityContextHolder . getContext ( )
. getAuthentication ( ) ;
if ( currentUser = = null ) {
return true ;
}
if ( ! checkForPrincipalChanges ) {
return false ;
}
if ( ! principalChanged ( request , currentUser ) ) {
return false ;
}
logger . debug ( "Pre-authenticated principal has changed and will be reauthenticated" ) ;
if ( invalidateSessionOnPrincipalChange ) {
SecurityContextHolder . clearContext ( ) ;
HttpSession session = request . getSession ( false ) ;
if ( session ! = null ) {
logger . debug ( "Invalidating existing session" ) ;
session . invalidate ( ) ;
request . getSession ( ) ;
}
}
return true ;
}
/ * *
* Puts the < code > Authentication < / code > instance returned by the authentication
* manager into the secure context .
@ -348,6 +318,14 @@ public abstract class AbstractPreAuthenticatedProcessingFilter extends GenericFi
@@ -348,6 +318,14 @@ public abstract class AbstractPreAuthenticatedProcessingFilter extends GenericFi
this . authenticationFailureHandler = authenticationFailureHandler ;
}
/ * *
* Sets the request matcher to check whether to proceed the request further .
* /
public void setRequiresAuthenticationRequestMatcher ( RequestMatcher requiresAuthenticationRequestMatcher ) {
Assert . notNull ( requiresAuthenticationRequestMatcher , "requestMatcher cannot be null" ) ;
this . requiresAuthenticationRequestMatcher = requiresAuthenticationRequestMatcher ;
}
/ * *
* Override to extract the principal information from the current request
* /
@ -359,4 +337,46 @@ public abstract class AbstractPreAuthenticatedProcessingFilter extends GenericFi
@@ -359,4 +337,46 @@ public abstract class AbstractPreAuthenticatedProcessingFilter extends GenericFi
* return a dummy value .
* /
protected abstract Object getPreAuthenticatedCredentials ( HttpServletRequest request ) ;
/ * *
* Request matcher for default auth check logic
* /
private class PreAuthenticatedProcessingRequestMatcher implements RequestMatcher {
@Override
public boolean matches ( HttpServletRequest request ) {
Authentication currentUser = SecurityContextHolder . getContext ( ) . getAuthentication ( ) ;
if ( currentUser = = null ) {
return true ;
}
if ( ! checkForPrincipalChanges ) {
return false ;
}
if ( ! principalChanged ( request , currentUser ) ) {
return false ;
}
logger . debug ( "Pre-authenticated principal has changed and will be reauthenticated" ) ;
if ( invalidateSessionOnPrincipalChange ) {
SecurityContextHolder . clearContext ( ) ;
HttpSession session = request . getSession ( false ) ;
if ( session ! = null ) {
logger . debug ( "Invalidating existing session" ) ;
session . invalidate ( ) ;
request . getSession ( ) ;
}
}
return true ;
}
}
}