diff --git a/core/src/main/java/org/acegisecurity/AuthenticationException.java b/core/src/main/java/org/acegisecurity/AuthenticationException.java
index 2dae104b86..4486ee1e85 100644
--- a/core/src/main/java/org/acegisecurity/AuthenticationException.java
+++ b/core/src/main/java/org/acegisecurity/AuthenticationException.java
@@ -24,6 +24,14 @@ package net.sf.acegisecurity;
* @version $Id$
*/
public abstract class AuthenticationException extends AcegiSecurityException {
+ //~ Instance fields ========================================================
+
+ /**
+ * The authentication that related to this exception (may be
+ * null)
+ */
+ private Authentication authentication;
+
//~ Constructors ===========================================================
/**
@@ -46,4 +54,14 @@ public abstract class AuthenticationException extends AcegiSecurityException {
public AuthenticationException(String msg) {
super(msg);
}
+
+ //~ Methods ================================================================
+
+ public void setAuthentication(Authentication authentication) {
+ this.authentication = authentication;
+ }
+
+ public Authentication getAuthentication() {
+ return authentication;
+ }
}
diff --git a/core/src/main/java/org/acegisecurity/ui/AbstractProcessingFilter.java b/core/src/main/java/org/acegisecurity/ui/AbstractProcessingFilter.java
index 39ac2cb52e..9ca30de7e7 100644
--- a/core/src/main/java/org/acegisecurity/ui/AbstractProcessingFilter.java
+++ b/core/src/main/java/org/acegisecurity/ui/AbstractProcessingFilter.java
@@ -18,6 +18,11 @@ package net.sf.acegisecurity.ui;
import net.sf.acegisecurity.Authentication;
import net.sf.acegisecurity.AuthenticationException;
import net.sf.acegisecurity.AuthenticationManager;
+import net.sf.acegisecurity.AuthenticationServiceException;
+import net.sf.acegisecurity.BadCredentialsException;
+import net.sf.acegisecurity.DisabledException;
+import net.sf.acegisecurity.LockedException;
+import net.sf.acegisecurity.providers.cas.ProxyUntrustedException;
import net.sf.acegisecurity.ui.webapp.HttpSessionIntegrationFilter;
import org.apache.commons.logging.Log;
@@ -95,9 +100,39 @@ public abstract class AbstractProcessingFilter implements Filter,
private AuthenticationManager authenticationManager;
+ /**
+ * Where to redirect the browser if authentication fails due to incorrect
+ * credentials
+ */
+ private String authenticationCredentialCheckFailureUrl;
+
+ /**
+ * Where to redirect the browser if authentication fails due to the users
+ * account being disabled
+ */
+ private String authenticationDisabledFailureUrl;
+
/** Where to redirect the browser to if authentication fails */
private String authenticationFailureUrl;
+ /**
+ * Where to redirect the browser if authentication fails due to the users
+ * account being locked
+ */
+ private String authenticationLockedFailureUrl;
+
+ /**
+ * Where to redirect the browser if authentication fails due to the user's
+ * proxy being considered untrusted
+ */
+ private String authenticationProxyUntrustedFailureUrl;
+
+ /**
+ * Where to redirect the browser if authentication fails due to failure of
+ * the authentication service
+ */
+ private String authenticationServiceFailureUrl;
+
/**
* Where to redirect the browser to if authentication is successful but
* ACEGI_SECURITY_TARGET_URL_KEY is null
@@ -133,6 +168,24 @@ public abstract class AbstractProcessingFilter implements Filter,
public abstract Authentication attemptAuthentication(
HttpServletRequest request) throws AuthenticationException;
+ public void setAuthenticationCredentialCheckFailureUrl(
+ String authenticationCredentialCheckFailureUrl) {
+ this.authenticationCredentialCheckFailureUrl = authenticationCredentialCheckFailureUrl;
+ }
+
+ public String getAuthenticationCredentialCheckFailureUrl() {
+ return authenticationCredentialCheckFailureUrl;
+ }
+
+ public void setAuthenticationDisabledFailureUrl(
+ String authenticationDisabledFailureUrl) {
+ this.authenticationDisabledFailureUrl = authenticationDisabledFailureUrl;
+ }
+
+ public String getAuthenticationDisabledFailureUrl() {
+ return authenticationDisabledFailureUrl;
+ }
+
public void setAuthenticationFailureUrl(String authenticationFailureUrl) {
this.authenticationFailureUrl = authenticationFailureUrl;
}
@@ -141,6 +194,15 @@ public abstract class AbstractProcessingFilter implements Filter,
return authenticationFailureUrl;
}
+ public void setAuthenticationLockedFailureUrl(
+ String authenticationLockedFailureUrl) {
+ this.authenticationLockedFailureUrl = authenticationLockedFailureUrl;
+ }
+
+ public String getAuthenticationLockedFailureUrl() {
+ return authenticationLockedFailureUrl;
+ }
+
public void setAuthenticationManager(
AuthenticationManager authenticationManager) {
this.authenticationManager = authenticationManager;
@@ -150,6 +212,24 @@ public abstract class AbstractProcessingFilter implements Filter,
return authenticationManager;
}
+ public void setAuthenticationProxyUntrustedFailureUrl(
+ String authenticationProxyUntrustedFailureUrl) {
+ this.authenticationProxyUntrustedFailureUrl = authenticationProxyUntrustedFailureUrl;
+ }
+
+ public String getAuthenticationProxyUntrustedFailureUrl() {
+ return authenticationProxyUntrustedFailureUrl;
+ }
+
+ public void setAuthenticationServiceFailureUrl(
+ String authenticationServiceFailureUrl) {
+ this.authenticationServiceFailureUrl = authenticationServiceFailureUrl;
+ }
+
+ public String getAuthenticationServiceFailureUrl() {
+ return authenticationServiceFailureUrl;
+ }
+
public void setDefaultTargetUrl(String defaultTargetUrl) {
this.defaultTargetUrl = defaultTargetUrl;
}
@@ -216,6 +296,33 @@ public abstract class AbstractProcessingFilter implements Filter,
authResult = attemptAuthentication(httpRequest);
} catch (AuthenticationException failed) {
// Authentication failed
+ String failureUrl = authenticationFailureUrl;
+
+ if (failed instanceof AuthenticationServiceException
+ && (authenticationServiceFailureUrl != null)) {
+ failureUrl = authenticationServiceFailureUrl;
+ }
+
+ if (failed instanceof BadCredentialsException
+ && (this.authenticationCredentialCheckFailureUrl != null)) {
+ failureUrl = authenticationCredentialCheckFailureUrl;
+ }
+
+ if (failed instanceof DisabledException
+ && (authenticationDisabledFailureUrl != null)) {
+ failureUrl = authenticationDisabledFailureUrl;
+ }
+
+ if (failed instanceof LockedException
+ && (authenticationLockedFailureUrl != null)) {
+ failureUrl = authenticationLockedFailureUrl;
+ }
+
+ if (failed instanceof ProxyUntrustedException
+ && (authenticationProxyUntrustedFailureUrl != null)) {
+ failureUrl = authenticationProxyUntrustedFailureUrl;
+ }
+
if (logger.isDebugEnabled()) {
logger.debug("Authentication request failed: "
+ failed.toString());
@@ -226,7 +333,7 @@ public abstract class AbstractProcessingFilter implements Filter,
httpRequest.getSession().setAttribute(HttpSessionIntegrationFilter.ACEGI_SECURITY_AUTHENTICATION_KEY,
null);
httpResponse.sendRedirect(httpResponse.encodeRedirectURL(httpRequest
- .getContextPath() + authenticationFailureUrl));
+ .getContextPath() + failureUrl));
return;
}