|
@@ -25,11 +25,14 @@ import org.acegisecurity.AuthenticationManager;
|
|
|
import org.acegisecurity.ConfigAttribute;
|
|
|
import org.acegisecurity.ConfigAttributeDefinition;
|
|
|
import org.acegisecurity.RunAsManager;
|
|
|
+
|
|
|
import org.acegisecurity.context.SecurityContextHolder;
|
|
|
+
|
|
|
import org.acegisecurity.event.authorization.AuthenticationCredentialsNotFoundEvent;
|
|
|
import org.acegisecurity.event.authorization.AuthorizationFailureEvent;
|
|
|
import org.acegisecurity.event.authorization.AuthorizedEvent;
|
|
|
import org.acegisecurity.event.authorization.PublicInvocationEvent;
|
|
|
+
|
|
|
import org.acegisecurity.runas.NullRunAsManager;
|
|
|
|
|
|
import org.apache.commons.logging.Log;
|
|
@@ -37,8 +40,8 @@ import org.apache.commons.logging.LogFactory;
|
|
|
|
|
|
import org.springframework.beans.factory.InitializingBean;
|
|
|
|
|
|
-import org.springframework.context.ApplicationEventPublisherAware;
|
|
|
import org.springframework.context.ApplicationEventPublisher;
|
|
|
+import org.springframework.context.ApplicationEventPublisherAware;
|
|
|
|
|
|
import org.springframework.util.Assert;
|
|
|
|
|
@@ -137,7 +140,7 @@ import java.util.Set;
|
|
|
* @version $Id$
|
|
|
*/
|
|
|
public abstract class AbstractSecurityInterceptor implements InitializingBean,
|
|
|
- ApplicationEventPublisherAware {
|
|
|
+ ApplicationEventPublisherAware {
|
|
|
//~ Static fields/initializers =============================================
|
|
|
|
|
|
protected static final Log logger = LogFactory.getLog(AbstractSecurityInterceptor.class);
|
|
@@ -150,6 +153,7 @@ public abstract class AbstractSecurityInterceptor implements InitializingBean,
|
|
|
private AuthenticationManager authenticationManager;
|
|
|
private RunAsManager runAsManager = new NullRunAsManager();
|
|
|
private boolean alwaysReauthenticate = false;
|
|
|
+ private boolean rejectPublicInvocations = false;
|
|
|
private boolean validateConfigAttributes = true;
|
|
|
|
|
|
//~ Methods ================================================================
|
|
@@ -184,7 +188,8 @@ public abstract class AbstractSecurityInterceptor implements InitializingBean,
|
|
|
return alwaysReauthenticate;
|
|
|
}
|
|
|
|
|
|
- public void setApplicationEventPublisher(ApplicationEventPublisher eventPublisher) {
|
|
|
+ public void setApplicationEventPublisher(
|
|
|
+ ApplicationEventPublisher eventPublisher) {
|
|
|
this.eventPublisher = eventPublisher;
|
|
|
}
|
|
|
|
|
@@ -217,6 +222,31 @@ public abstract class AbstractSecurityInterceptor implements InitializingBean,
|
|
|
return this.authenticationManager;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * By rejecting public invocations (and setting this property to
|
|
|
+ * <code>true</code>), essentially you are ensuring that every secure
|
|
|
+ * object invocation advised by <code>AbstractSecurityInterceptor</code>
|
|
|
+ * has a configuration attribute defined. This is useful to ensure a "fail
|
|
|
+ * safe" mode where undeclared secure objects will be rejected and
|
|
|
+ * configuration omissions detected early. An
|
|
|
+ * <code>IllegalArgumentException</code> will be thrown by the
|
|
|
+ * <code>AbstractSecurityInterceptor</code> if you set this property to
|
|
|
+ * <code>true</code> and an attempt is made to invoke a secure object that
|
|
|
+ * has no configuration attributes.
|
|
|
+ *
|
|
|
+ * @param rejectPublicInvocations set to <code>true</code> to reject
|
|
|
+ * invocations of secure objects that have no configuration
|
|
|
+ * attributes (by default it is <code>true</code> which treats
|
|
|
+ * undeclared secure objects as "public" or unauthorized)
|
|
|
+ */
|
|
|
+ public void setRejectPublicInvocations(boolean rejectPublicInvocations) {
|
|
|
+ this.rejectPublicInvocations = rejectPublicInvocations;
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean isRejectPublicInvocations() {
|
|
|
+ return rejectPublicInvocations;
|
|
|
+ }
|
|
|
+
|
|
|
public void setRunAsManager(RunAsManager runAsManager) {
|
|
|
this.runAsManager = runAsManager;
|
|
|
}
|
|
@@ -365,6 +395,11 @@ public abstract class AbstractSecurityInterceptor implements InitializingBean,
|
|
|
ConfigAttributeDefinition attr = this.obtainObjectDefinitionSource()
|
|
|
.getAttributes(object);
|
|
|
|
|
|
+ if ((attr == null) && rejectPublicInvocations) {
|
|
|
+ throw new IllegalArgumentException(
|
|
|
+ "No public invocations are allowed via this AbstractSecurityInterceptor. This indicates a configuration error because the AbstractSecurityInterceptor.rejectPublicInvocations property is set to 'true'");
|
|
|
+ }
|
|
|
+
|
|
|
if (attr != null) {
|
|
|
if (logger.isDebugEnabled()) {
|
|
|
logger.debug("Secure object: " + object.toString()
|