diff --git a/acl/src/main/java/org/springframework/security/acls/AclException.java b/acl/src/main/java/org/springframework/security/acls/AclException.java
new file mode 100644
index 0000000000..6b2c1dcd29
--- /dev/null
+++ b/acl/src/main/java/org/springframework/security/acls/AclException.java
@@ -0,0 +1,34 @@
+package org.springframework.security.acls;
+
+import org.springframework.core.NestedRuntimeException;
+
+/**
+ * Abstract superclass for all exceptions thrown in the acls package and subpackages.
+ *
+ * @author Luke Taylor
+ * @version $Id$
+ * @since 2.5
+ */
+public abstract class AclException extends NestedRuntimeException {
+
+ /**
+ * Constructs an AclException with the specified
+ * message and root cause.
+ *
+ * @param msg the detail message
+ * @param t the root cause
+ */
+ public AclException(String msg, Throwable cause) {
+ super(msg, cause);
+ }
+
+ /**
+ * Constructs an AclException with the specified
+ * message and no root cause.
+ *
+ * @param msg the detail message
+ */
+ public AclException(String msg) {
+ super(msg);
+ }
+}
diff --git a/acl/src/main/java/org/springframework/security/acls/AlreadyExistsException.java b/acl/src/main/java/org/springframework/security/acls/AlreadyExistsException.java
index ef3423025a..16a54afa65 100644
--- a/acl/src/main/java/org/springframework/security/acls/AlreadyExistsException.java
+++ b/acl/src/main/java/org/springframework/security/acls/AlreadyExistsException.java
@@ -14,16 +14,13 @@
*/
package org.springframework.security.acls;
-import org.springframework.security.core.SpringSecurityException;
-
-
/**
* Thrown if an Acl entry already exists for the object.
*
* @author Ben Alex
* @version $Id$
*/
-public class AlreadyExistsException extends SpringSecurityException {
+public class AlreadyExistsException extends AclException {
//~ Constructors ===================================================================================================
/**
diff --git a/acl/src/main/java/org/springframework/security/acls/ChildrenExistException.java b/acl/src/main/java/org/springframework/security/acls/ChildrenExistException.java
index 72bfc03844..52bd9dd55f 100644
--- a/acl/src/main/java/org/springframework/security/acls/ChildrenExistException.java
+++ b/acl/src/main/java/org/springframework/security/acls/ChildrenExistException.java
@@ -14,16 +14,13 @@
*/
package org.springframework.security.acls;
-import org.springframework.security.core.SpringSecurityException;
-
-
/**
* Thrown if an {@link Acl} cannot be deleted because children Acls exist.
*
* @author Ben Alex
* @version $Id$
*/
-public class ChildrenExistException extends SpringSecurityException {
+public class ChildrenExistException extends AclException {
//~ Constructors ===================================================================================================
/**
diff --git a/acl/src/main/java/org/springframework/security/acls/IdentityUnavailableException.java b/acl/src/main/java/org/springframework/security/acls/IdentityUnavailableException.java
index 156c552f90..4c0cf4aeff 100644
--- a/acl/src/main/java/org/springframework/security/acls/IdentityUnavailableException.java
+++ b/acl/src/main/java/org/springframework/security/acls/IdentityUnavailableException.java
@@ -14,16 +14,13 @@
*/
package org.springframework.security.acls;
-import org.springframework.security.core.SpringSecurityException;
-
-
/**
* Thrown if an ACL identity could not be extracted from an object.
*
* @author Ben Alex
* @version $Id$
*/
-public class IdentityUnavailableException extends SpringSecurityException {
+public class IdentityUnavailableException extends AclException {
//~ Constructors ===================================================================================================
/**
diff --git a/acl/src/main/java/org/springframework/security/acls/NotFoundException.java b/acl/src/main/java/org/springframework/security/acls/NotFoundException.java
index 07a635c593..20dc4b87d3 100644
--- a/acl/src/main/java/org/springframework/security/acls/NotFoundException.java
+++ b/acl/src/main/java/org/springframework/security/acls/NotFoundException.java
@@ -14,16 +14,13 @@
*/
package org.springframework.security.acls;
-import org.springframework.security.core.SpringSecurityException;
-
-
/**
* Thrown if an ACL-related object cannot be found.
*
* @author Ben Alex
* @version $Id$
*/
-public class NotFoundException extends SpringSecurityException {
+public class NotFoundException extends AclException {
//~ Constructors ===================================================================================================
/**
diff --git a/acl/src/main/java/org/springframework/security/acls/UnloadedSidException.java b/acl/src/main/java/org/springframework/security/acls/UnloadedSidException.java
index e6e2fea05b..451a55dbc4 100644
--- a/acl/src/main/java/org/springframework/security/acls/UnloadedSidException.java
+++ b/acl/src/main/java/org/springframework/security/acls/UnloadedSidException.java
@@ -14,9 +14,6 @@
*/
package org.springframework.security.acls;
-import org.springframework.security.core.SpringSecurityException;
-
-
/**
* Thrown if an {@link Acl} cannot perform an operation because it only loaded a subset of Sids and
* the caller has requested details for an unloaded Sid.
@@ -24,7 +21,7 @@ import org.springframework.security.core.SpringSecurityException;
* @author Ben Alex
* @version $Id$
*/
-public class UnloadedSidException extends SpringSecurityException {
+public class UnloadedSidException extends AclException {
//~ Constructors ===================================================================================================
/**
diff --git a/config/src/main/java/org/springframework/security/config/SecurityConfigurationException.java b/config/src/main/java/org/springframework/security/config/SecurityConfigurationException.java
index 3c50ff0633..bc4e03b579 100644
--- a/config/src/main/java/org/springframework/security/config/SecurityConfigurationException.java
+++ b/config/src/main/java/org/springframework/security/config/SecurityConfigurationException.java
@@ -1,14 +1,13 @@
package org.springframework.security.config;
-import org.springframework.security.core.SpringSecurityException;
-
+import org.springframework.core.NestedRuntimeException;
/**
* @author Luke Taylor
* @author Ben Alex
* @version $Id$
*/
-public class SecurityConfigurationException extends SpringSecurityException {
+public class SecurityConfigurationException extends NestedRuntimeException {
public SecurityConfigurationException(String s) {
super(s);
}
diff --git a/core/src/main/java/org/springframework/security/access/AccessDeniedException.java b/core/src/main/java/org/springframework/security/access/AccessDeniedException.java
index 5953494744..dd63585c4c 100644
--- a/core/src/main/java/org/springframework/security/access/AccessDeniedException.java
+++ b/core/src/main/java/org/springframework/security/access/AccessDeniedException.java
@@ -15,8 +15,8 @@
package org.springframework.security.access;
+import org.springframework.core.NestedRuntimeException;
import org.springframework.security.core.Authentication;
-import org.springframework.security.core.SpringSecurityException;
/**
* Thrown if an {@link Authentication} object does not hold a required authority.
@@ -24,7 +24,7 @@ import org.springframework.security.core.SpringSecurityException;
* @author Ben Alex
* @version $Id$
*/
-public class AccessDeniedException extends SpringSecurityException {
+public class AccessDeniedException extends NestedRuntimeException {
//~ Constructors ===================================================================================================
/**
diff --git a/core/src/main/java/org/springframework/security/authentication/BadCredentialsException.java b/core/src/main/java/org/springframework/security/authentication/BadCredentialsException.java
index 044b1fb43b..8ad0760593 100644
--- a/core/src/main/java/org/springframework/security/authentication/BadCredentialsException.java
+++ b/core/src/main/java/org/springframework/security/authentication/BadCredentialsException.java
@@ -51,7 +51,4 @@ public class BadCredentialsException extends AuthenticationException {
public BadCredentialsException(String msg, Throwable t) {
super(msg, t);
}
-
- //~ Methods ========================================================================================================
-
}
diff --git a/core/src/main/java/org/springframework/security/authentication/jaas/DefaultLoginExceptionResolver.java b/core/src/main/java/org/springframework/security/authentication/jaas/DefaultLoginExceptionResolver.java
index 17dc8c7014..cdad0ba216 100644
--- a/core/src/main/java/org/springframework/security/authentication/jaas/DefaultLoginExceptionResolver.java
+++ b/core/src/main/java/org/springframework/security/authentication/jaas/DefaultLoginExceptionResolver.java
@@ -16,7 +16,7 @@
package org.springframework.security.authentication.jaas;
import org.springframework.security.authentication.AuthenticationServiceException;
-import org.springframework.security.core.SpringSecurityException;
+import org.springframework.security.core.AuthenticationException;
import javax.security.auth.login.LoginException;
@@ -30,7 +30,7 @@ import javax.security.auth.login.LoginException;
public class DefaultLoginExceptionResolver implements LoginExceptionResolver {
//~ Methods ========================================================================================================
- public SpringSecurityException resolveException(LoginException e) {
+ public AuthenticationException resolveException(LoginException e) {
return new AuthenticationServiceException(e.getMessage(), e);
}
}
diff --git a/core/src/main/java/org/springframework/security/authentication/jaas/JaasAuthenticationProvider.java b/core/src/main/java/org/springframework/security/authentication/jaas/JaasAuthenticationProvider.java
index 87aa6315ea..3550ac5f6d 100644
--- a/core/src/main/java/org/springframework/security/authentication/jaas/JaasAuthenticationProvider.java
+++ b/core/src/main/java/org/springframework/security/authentication/jaas/JaasAuthenticationProvider.java
@@ -218,7 +218,7 @@ public class JaasAuthenticationProvider implements AuthenticationProvider, Appli
return result;
} catch (LoginException loginException) {
- SpringSecurityException ase = loginExceptionResolver.resolveException(loginException);
+ AuthenticationException ase = loginExceptionResolver.resolveException(loginException);
publishFailureEvent(request, ase);
throw ase;
@@ -354,7 +354,7 @@ public class JaasAuthenticationProvider implements AuthenticationProvider, Appli
* @param token The {@link UsernamePasswordAuthenticationToken} being processed
* @param ase The {@link SpringSecurityException} that caused the failure
*/
- protected void publishFailureEvent(UsernamePasswordAuthenticationToken token, SpringSecurityException ase) {
+ protected void publishFailureEvent(UsernamePasswordAuthenticationToken token, AuthenticationException ase) {
applicationEventPublisher.publishEvent(new JaasAuthenticationFailedEvent(token, ase));
}
diff --git a/core/src/main/java/org/springframework/security/authentication/jaas/LoginExceptionResolver.java b/core/src/main/java/org/springframework/security/authentication/jaas/LoginExceptionResolver.java
index d67815a9ef..e1fb1ab075 100644
--- a/core/src/main/java/org/springframework/security/authentication/jaas/LoginExceptionResolver.java
+++ b/core/src/main/java/org/springframework/security/authentication/jaas/LoginExceptionResolver.java
@@ -15,15 +15,15 @@
package org.springframework.security.authentication.jaas;
-import org.springframework.security.core.SpringSecurityException;
+import org.springframework.security.core.AuthenticationException;
import javax.security.auth.login.LoginException;
/**
* The JaasAuthenticationProvider takes an instance of LoginExceptionResolver
- * to resolve LoginModule specific exceptions to Spring Security exceptions. For
- * instance, a configured login module could throw a
+ * to resolve LoginModule specific exceptions to Spring Security AuthenticationExceptions.
+ * For instance, a configured login module could throw a
* ScrewedUpPasswordException that extends LoginException, in this instance
* the LoginExceptionResolver implementation would return a {@link
* org.springframework.security.authentication.BadCredentialsException}.
@@ -39,7 +39,7 @@ public interface LoginExceptionResolver {
*
* @param e The LoginException thrown by the configured LoginModule.
*
- * @return The SpringSecurityException that the JaasAuthenticationProvider should throw.
+ * @return The AuthenticationException that the JaasAuthenticationProvider should throw.
*/
- SpringSecurityException resolveException(LoginException e);
+ AuthenticationException resolveException(LoginException e);
}
diff --git a/core/src/main/java/org/springframework/security/authentication/rcp/RemoteAuthenticationException.java b/core/src/main/java/org/springframework/security/authentication/rcp/RemoteAuthenticationException.java
index ec31bc440c..4102edb6f8 100644
--- a/core/src/main/java/org/springframework/security/authentication/rcp/RemoteAuthenticationException.java
+++ b/core/src/main/java/org/springframework/security/authentication/rcp/RemoteAuthenticationException.java
@@ -15,21 +15,22 @@
package org.springframework.security.authentication.rcp;
-import org.springframework.security.core.SpringSecurityException;
-
+import org.springframework.core.NestedRuntimeException;
/**
- * Thrown if a RemoteAuthenticationManager cannot validate the presented authentication request.
This
- * is thrown rather than the normal AuthenticationException because AuthenticationException
- * contains additional properties which may cause issues for the remoting protocol.
RemoteAuthenticationManager cannot validate the presented authentication request.
+ *
+ * This is thrown rather than the normal AuthenticationException because
+ * AuthenticationException contains additional properties which may cause issues for
+ * the remoting protocol.
*
* @author Ben Alex
* @version $Id$
*/
-public class RemoteAuthenticationException extends SpringSecurityException {
+public class RemoteAuthenticationException extends NestedRuntimeException {
//~ Constructors ===================================================================================================
-/**
+ /**
* Constructs a RemoteAuthenticationException with the
* specified message and no root cause.
*
diff --git a/core/src/main/java/org/springframework/security/core/AuthenticationException.java b/core/src/main/java/org/springframework/security/core/AuthenticationException.java
index 7cafee34cc..18e1fe00b9 100644
--- a/core/src/main/java/org/springframework/security/core/AuthenticationException.java
+++ b/core/src/main/java/org/springframework/security/core/AuthenticationException.java
@@ -15,6 +15,8 @@
package org.springframework.security.core;
+import org.springframework.core.NestedRuntimeException;
+
/**
* Abstract superclass for all exceptions related to an {@link Authentication} object being invalid for whatever
@@ -23,7 +25,7 @@ package org.springframework.security.core;
* @author Ben Alex
* @version $Id$
*/
-public abstract class AuthenticationException extends SpringSecurityException {
+public abstract class AuthenticationException extends NestedRuntimeException {
//~ Instance fields ================================================================================================
private Authentication authentication;
diff --git a/core/src/main/java/org/springframework/security/userdetails/UsernameNotFoundException.java b/core/src/main/java/org/springframework/security/userdetails/UsernameNotFoundException.java
index 1f8775852d..a8b4cf218b 100644
--- a/core/src/main/java/org/springframework/security/userdetails/UsernameNotFoundException.java
+++ b/core/src/main/java/org/springframework/security/userdetails/UsernameNotFoundException.java
@@ -15,7 +15,7 @@
package org.springframework.security.userdetails;
-import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.core.AuthenticationException;
/**
@@ -24,7 +24,7 @@ import org.springframework.security.authentication.BadCredentialsException;
* @author Ben Alex
* @version $Id$
*/
-public class UsernameNotFoundException extends BadCredentialsException {
+public class UsernameNotFoundException extends AuthenticationException {
//~ Constructors ===================================================================================================
/**
diff --git a/core/src/main/java/org/springframework/security/util/EncryptionUtils.java b/core/src/main/java/org/springframework/security/util/EncryptionUtils.java
index c0fc048b76..c6602f143d 100644
--- a/core/src/main/java/org/springframework/security/util/EncryptionUtils.java
+++ b/core/src/main/java/org/springframework/security/util/EncryptionUtils.java
@@ -23,8 +23,8 @@ import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
-import org.springframework.security.core.SpringSecurityException;
import org.apache.commons.codec.binary.Base64;
+import org.springframework.core.NestedRuntimeException;
import org.springframework.util.Assert;
/**
@@ -150,7 +150,7 @@ public final class EncryptionUtils {
Assert.isTrue(key.length() >= 24, "Key must be at least 24 characters long");
}
- public static class EncryptionException extends SpringSecurityException {
+ public static class EncryptionException extends NestedRuntimeException {
private static final long serialVersionUID = 1L;
public EncryptionException(String message, Throwable t) {
diff --git a/core/src/test/java/org/springframework/security/authentication/jaas/JaasAuthenticationProviderTests.java b/core/src/test/java/org/springframework/security/authentication/jaas/JaasAuthenticationProviderTests.java
index 46988c276e..5eb9efad32 100644
--- a/core/src/test/java/org/springframework/security/authentication/jaas/JaasAuthenticationProviderTests.java
+++ b/core/src/test/java/org/springframework/security/authentication/jaas/JaasAuthenticationProviderTests.java
@@ -41,7 +41,6 @@ import org.springframework.security.core.AuthorityUtils;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.GrantedAuthorityImpl;
import org.springframework.security.core.SessionDestroyedEvent;
-import org.springframework.security.core.SpringSecurityException;
import org.springframework.security.core.context.SecurityContextImpl;
@@ -187,7 +186,7 @@ public class JaasAuthenticationProviderTests extends TestCase {
public void testLoginExceptionResolver() {
assertNotNull(jaasProvider.getLoginExceptionResolver());
jaasProvider.setLoginExceptionResolver(new LoginExceptionResolver() {
- public SpringSecurityException resolveException(LoginException e) {
+ public AuthenticationException resolveException(LoginException e) {
return new LockedException("This is just a test!");
}
});
diff --git a/ldap/src/test/java/org/springframework/security/ldap/authentication/LdapAuthenticationProviderTests.java b/ldap/src/test/java/org/springframework/security/ldap/authentication/LdapAuthenticationProviderTests.java
index 35670ba1e7..d84ad8b8e4 100644
--- a/ldap/src/test/java/org/springframework/security/ldap/authentication/LdapAuthenticationProviderTests.java
+++ b/ldap/src/test/java/org/springframework/security/ldap/authentication/LdapAuthenticationProviderTests.java
@@ -34,7 +34,6 @@ import org.springframework.security.core.AuthorityUtils;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.ldap.LdapAuthenticator;
import org.springframework.security.ldap.LdapAuthoritiesPopulator;
-import org.springframework.security.ldap.authentication.LdapAuthenticationProvider;
import org.springframework.security.ldap.userdetails.LdapUserDetailsMapper;
import org.springframework.security.userdetails.UserDetails;
import org.springframework.security.userdetails.UsernameNotFoundException;
@@ -89,7 +88,7 @@ public class LdapAuthenticationProviderTests {
ldapProvider.authenticate(new UsernamePasswordAuthenticationToken("jen", ""));
}
- @Test
+ @Test(expected=BadCredentialsException.class)
public void usernameNotFoundExceptionIsHiddenByDefault() {
final LdapAuthenticator authenticator = jmock.mock(LdapAuthenticator.class);
final UsernamePasswordAuthenticationToken joe = new UsernamePasswordAuthenticationToken("joe", "password");
@@ -98,14 +97,7 @@ public class LdapAuthenticationProviderTests {
}});
LdapAuthenticationProvider provider = new LdapAuthenticationProvider(authenticator);
- try {
- provider.authenticate(joe);
- fail();
- } catch (BadCredentialsException expected) {
- if (expected instanceof UsernameNotFoundException) {
- fail("Exception should have been hidden");
- }
- }
+ provider.authenticate(joe);
}
@Test(expected=UsernameNotFoundException.class)
diff --git a/web/src/main/java/org/springframework/security/web/ExceptionTranslationFilter.java b/web/src/main/java/org/springframework/security/web/ExceptionTranslationFilter.java
index f1fe454b4b..ccf0b36001 100644
--- a/web/src/main/java/org/springframework/security/web/ExceptionTranslationFilter.java
+++ b/web/src/main/java/org/springframework/security/web/ExceptionTranslationFilter.java
@@ -26,6 +26,7 @@ import org.springframework.security.util.ThrowableAnalyzer;
import org.springframework.security.util.ThrowableCauseExtractor;
import org.springframework.security.web.savedrequest.SavedRequest;
import org.springframework.beans.factory.InitializingBean;
+import org.springframework.core.NestedRuntimeException;
import org.springframework.util.Assert;
@@ -102,14 +103,17 @@ public class ExceptionTranslationFilter extends SpringSecurityFilter implements
}
catch (Exception ex) {
// Try to extract a SpringSecurityException from the stacktrace
- Throwable[] causeChain = this.throwableAnalyzer.determineCauseChain(ex);
- SpringSecurityException ase = (SpringSecurityException)
- this.throwableAnalyzer.getFirstThrowableOfType(SpringSecurityException.class, causeChain);
+ Throwable[] causeChain = throwableAnalyzer.determineCauseChain(ex);
+ NestedRuntimeException ase = (NestedRuntimeException)
+ throwableAnalyzer.getFirstThrowableOfType(AuthenticationException.class, causeChain);
+
+ if (ase == null) {
+ ase = (NestedRuntimeException)throwableAnalyzer.getFirstThrowableOfType(AccessDeniedException.class, causeChain);
+ }
if (ase != null) {
handleException(request, response, chain, ase);
- }
- else {
+ } else {
// Rethrow ServletExceptions and RuntimeExceptions as-is
if (ex instanceof ServletException) {
throw (ServletException) ex;
@@ -137,7 +141,7 @@ public class ExceptionTranslationFilter extends SpringSecurityFilter implements
}
private void handleException(HttpServletRequest request, HttpServletResponse response, FilterChain chain,
- SpringSecurityException exception) throws IOException, ServletException {
+ NestedRuntimeException exception) throws IOException, ServletException {
if (exception instanceof AuthenticationException) {
if (logger.isDebugEnabled()) {
logger.debug("Authentication exception occurred; redirecting to authentication entry point", exception);