SEC-618: Moved copyDetails method down to ProviderManager so that it can be called prior to checking if authentication is allowed by ConcurrentSessionController.

This commit is contained in:
Luke Taylor 2007-12-07 16:26:50 +00:00
parent b12a4939df
commit 4984024314
2 changed files with 21 additions and 25 deletions

View File

@ -15,9 +15,6 @@
package org.springframework.security; package org.springframework.security;
import org.springframework.security.providers.AbstractAuthenticationToken;
/** /**
* An abstract implementation of the {@link AuthenticationManager}. * An abstract implementation of the {@link AuthenticationManager}.
* *
@ -43,10 +40,7 @@ public abstract class AbstractAuthenticationManager implements AuthenticationMan
public final Authentication authenticate(Authentication authRequest) public final Authentication authenticate(Authentication authRequest)
throws AuthenticationException { throws AuthenticationException {
try { try {
Authentication authResult = doAuthentication(authRequest); return doAuthentication(authRequest);
copyDetails(authRequest, authResult);
return authResult;
} catch (AuthenticationException e) { } catch (AuthenticationException e) {
e.setAuthentication(authRequest); e.setAuthentication(authRequest);
throw e; throw e;
@ -54,24 +48,10 @@ public abstract class AbstractAuthenticationManager implements AuthenticationMan
} }
/** /**
* Copies the authentication details from a source Authentication object to a destination one, provided the * Concrete implementations of this class override this method to provide the authentication service.
* latter does not already have one set. * <p>
* * The contract for this method is documented in the
* @param source source authentication * {@link AuthenticationManager#authenticate(org.springframework.security.Authentication)}.
* @param dest the destination authentication object
*/
private void copyDetails(Authentication source, Authentication dest) {
if ((dest instanceof AbstractAuthenticationToken) && (dest.getDetails() == null)) {
AbstractAuthenticationToken token = (AbstractAuthenticationToken) dest;
token.setDetails(source.getDetails());
}
}
/**
* <p>Concrete implementations of this class override this method to provide the authentication service.</p>
* <p>The contract for this method is documented in the {@link
* AuthenticationManager#authenticate(org.springframework.security.Authentication)}.</p>
* *
* @param authentication the authentication request object * @param authentication the authentication request object
* *

View File

@ -200,6 +200,7 @@ public class ProviderManager extends AbstractAuthenticationManager implements In
try { try {
result = provider.authenticate(authentication); result = provider.authenticate(authentication);
copyDetails(authentication, result);
sessionController.checkAuthenticationAllowed(result); sessionController.checkAuthenticationAllowed(result);
} catch (AuthenticationException ae) { } catch (AuthenticationException ae) {
lastException = ae; lastException = ae;
@ -252,6 +253,21 @@ public class ProviderManager extends AbstractAuthenticationManager implements In
throw lastException; throw lastException;
} }
/**
* Copies the authentication details from a source Authentication object to a destination one, provided the
* latter does not already have one set.
*
* @param source source authentication
* @param dest the destination authentication object
*/
private void copyDetails(Authentication source, Authentication dest) {
if ((dest instanceof AbstractAuthenticationToken) && (dest.getDetails() == null)) {
AbstractAuthenticationToken token = (AbstractAuthenticationToken) dest;
token.setDetails(source.getDetails());
}
}
public List getProviders() { public List getProviders() {
return this.providers; return this.providers;
} }