diff --git a/core/src/main/java/org/acegisecurity/AbstractAuthenticationManager.java b/core/src/main/java/org/acegisecurity/AbstractAuthenticationManager.java new file mode 100644 index 0000000000..c56aa63d13 --- /dev/null +++ b/core/src/main/java/org/acegisecurity/AbstractAuthenticationManager.java @@ -0,0 +1,75 @@ +/* Copyright 2004 Acegi Technology Pty Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.sf.acegisecurity; + +/** + * An abstract implementation of the {@link AuthenticationManager}. + * + * @author Wesley Hall + * @version $Id$ + */ +public abstract class AbstractAuthenticationManager + implements AuthenticationManager { + //~ Methods ================================================================ + + /** + *

+ * An implementation of the authenticate method that calls the + * abstract method doAuthenticatation to do its work. + *

+ * + *

+ * If doAuthenticate throws an AuthenticationException then + * the exception is populated with the failed Authentication + * object that failed. + *

+ * + * @param authentication the authentication request object + * + * @return a fully authenticated object including credentials + * + * @throws AuthenticationException if authentication fails + */ + public final Authentication authenticate(Authentication authentication) + throws AuthenticationException { + try { + return doAuthentication(authentication); + } catch (AuthenticationException e) { + e.setAuthentication(authentication); + throw e; + } + } + + /** + *

+ * Concrete implementations of this class override this method to provide + * the authentication service. + *

+ * + *

+ * The contract for this method is documented in the {@link + * AuthenticationManager#authenticate(net.sf.acegisecurity.Authentication)}. + *

+ * + * @param authentication the authentication request object + * + * @return a fully authenticated object including credentials + * + * @throws AuthenticationException if authentication fails + */ + protected abstract Authentication doAuthentication( + Authentication authentication) throws AuthenticationException; +} diff --git a/core/src/main/java/org/acegisecurity/providers/ProviderManager.java b/core/src/main/java/org/acegisecurity/providers/ProviderManager.java index fa21ba0d6f..f1e9b75472 100644 --- a/core/src/main/java/org/acegisecurity/providers/ProviderManager.java +++ b/core/src/main/java/org/acegisecurity/providers/ProviderManager.java @@ -15,9 +15,9 @@ package net.sf.acegisecurity.providers; +import net.sf.acegisecurity.AbstractAuthenticationManager; import net.sf.acegisecurity.Authentication; import net.sf.acegisecurity.AuthenticationException; -import net.sf.acegisecurity.AuthenticationManager; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -29,13 +29,15 @@ import java.util.List; /** - * Iterates an {@link Authentication} request through a list of {@link + * Iterates an {@link Authentication} request through a list of {@link * AuthenticationProvider}s. * * @author Ben Alex + * @author Wesley Hall * @version $Id$ */ -public class ProviderManager implements InitializingBean, AuthenticationManager { +public class ProviderManager extends AbstractAuthenticationManager + implements InitializingBean { //~ Static fields/initializers ============================================= private static final Log logger = LogFactory.getLog(ProviderManager.class); @@ -109,7 +111,7 @@ public class ProviderManager implements InitializingBean, AuthenticationManager * @throws AuthenticationException if authentication fails. * @throws ProviderNotFoundException DOCUMENT ME! */ - public Authentication authenticate(Authentication authentication) + public Authentication doAuthentication(Authentication authentication) throws AuthenticationException { Iterator iter = providers.iterator(); diff --git a/core/src/test/java/org/acegisecurity/MockAuthenticationManager.java b/core/src/test/java/org/acegisecurity/MockAuthenticationManager.java index d781f55c6a..54f3bd8cd4 100644 --- a/core/src/test/java/org/acegisecurity/MockAuthenticationManager.java +++ b/core/src/test/java/org/acegisecurity/MockAuthenticationManager.java @@ -20,9 +20,10 @@ package net.sf.acegisecurity; * grantAccess is set to true. * * @author Ben Alex + * @author Wesley Hall * @version $Id$ */ -public class MockAuthenticationManager implements AuthenticationManager { +public class MockAuthenticationManager extends AbstractAuthenticationManager { //~ Instance fields ======================================================== private boolean grantAccess = true; @@ -39,7 +40,7 @@ public class MockAuthenticationManager implements AuthenticationManager { //~ Methods ================================================================ - public Authentication authenticate(Authentication authentication) + public Authentication doAuthentication(Authentication authentication) throws AuthenticationException { if (grantAccess) { return authentication;