|
@@ -1,4 +1,4 @@
|
|
|
-/* Copyright 2004, 2005 Acegi Technology Pty Limited
|
|
|
+/* Copyright 2004, 2005, 2006 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.
|
|
@@ -17,11 +17,15 @@ package org.acegisecurity.vote;
|
|
|
|
|
|
import org.acegisecurity.AuthorizationServiceException;
|
|
|
import org.acegisecurity.ConfigAttribute;
|
|
|
+
|
|
|
import org.acegisecurity.acl.AclEntry;
|
|
|
import org.acegisecurity.acl.AclManager;
|
|
|
|
|
|
import org.aopalliance.intercept.MethodInvocation;
|
|
|
|
|
|
+import org.aspectj.lang.JoinPoint;
|
|
|
+import org.aspectj.lang.reflect.CodeSignature;
|
|
|
+
|
|
|
import org.springframework.util.Assert;
|
|
|
|
|
|
import java.lang.reflect.Method;
|
|
@@ -39,8 +43,7 @@ import java.lang.reflect.Method;
|
|
|
* <code>Authentication</code> object. This class is designed to process
|
|
|
* {@link AclEntry}s that are subclasses of {@link
|
|
|
* org.acegisecurity.acl.basic.BasicAclEntry} only. Generally these are
|
|
|
- * obtained by using the {@link
|
|
|
- * org.acegisecurity.acl.basic.BasicAclProvider}.
|
|
|
+ * obtained by using the {@link org.acegisecurity.acl.basic.BasicAclProvider}.
|
|
|
* </p>
|
|
|
*
|
|
|
* <p>
|
|
@@ -122,16 +125,42 @@ public abstract class AbstractAclVoter implements AccessDecisionVoter {
|
|
|
|
|
|
//~ Methods ================================================================
|
|
|
|
|
|
- public void setProcessDomainObjectClass(Class processDomainObjectClass) {
|
|
|
- Assert.notNull(processDomainObjectClass,
|
|
|
- "processDomainObjectClass cannot be set to null");
|
|
|
- this.processDomainObjectClass = processDomainObjectClass;
|
|
|
+ protected Object getDomainObjectInstance(Object secureObject) {
|
|
|
+ Object[] args;
|
|
|
+ Class[] params;
|
|
|
+
|
|
|
+ if (secureObject instanceof MethodInvocation) {
|
|
|
+ MethodInvocation invocation = (MethodInvocation) secureObject;
|
|
|
+ params = invocation.getMethod().getParameterTypes();
|
|
|
+ args = invocation.getArguments();
|
|
|
+ } else {
|
|
|
+ JoinPoint jp = (JoinPoint) secureObject;
|
|
|
+ params = ((CodeSignature) jp.getStaticPart().getSignature())
|
|
|
+ .getParameterTypes();
|
|
|
+ args = jp.getArgs();
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int i = 0; i < params.length; i++) {
|
|
|
+ if (processDomainObjectClass.isAssignableFrom(params[i])) {
|
|
|
+ return args[i];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ throw new AuthorizationServiceException("Secure object: "
|
|
|
+ + secureObject + " did not provide any argument of type: "
|
|
|
+ + processDomainObjectClass);
|
|
|
}
|
|
|
|
|
|
public Class getProcessDomainObjectClass() {
|
|
|
return processDomainObjectClass;
|
|
|
}
|
|
|
|
|
|
+ public void setProcessDomainObjectClass(Class processDomainObjectClass) {
|
|
|
+ Assert.notNull(processDomainObjectClass,
|
|
|
+ "processDomainObjectClass cannot be set to null");
|
|
|
+ this.processDomainObjectClass = processDomainObjectClass;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* This implementation supports only
|
|
|
* <code>MethodSecurityInterceptor</code>, because it queries the
|
|
@@ -143,24 +172,12 @@ public abstract class AbstractAclVoter implements AccessDecisionVoter {
|
|
|
* <code>MethodInvocation</code>, <code>false</code> otherwise
|
|
|
*/
|
|
|
public boolean supports(Class clazz) {
|
|
|
- return (MethodInvocation.class.isAssignableFrom(clazz));
|
|
|
- }
|
|
|
-
|
|
|
- protected Object getDomainObjectInstance(Object secureObject) {
|
|
|
- MethodInvocation invocation = (MethodInvocation) secureObject;
|
|
|
-
|
|
|
- // Check if this MethodInvocation provides the required argument
|
|
|
- Method method = invocation.getMethod();
|
|
|
- Class[] params = method.getParameterTypes();
|
|
|
-
|
|
|
- for (int i = 0; i < params.length; i++) {
|
|
|
- if (processDomainObjectClass.isAssignableFrom(params[i])) {
|
|
|
- return invocation.getArguments()[i];
|
|
|
- }
|
|
|
+ if (MethodInvocation.class.isAssignableFrom(clazz)) {
|
|
|
+ return true;
|
|
|
+ } else if (JoinPoint.class.isAssignableFrom(clazz)) {
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ return false;
|
|
|
}
|
|
|
-
|
|
|
- throw new AuthorizationServiceException("MethodInvocation: "
|
|
|
- + invocation + " did not provide any argument of type: "
|
|
|
- + processDomainObjectClass);
|
|
|
}
|
|
|
}
|