Expand test coverage. Clover via Maven (without excluding appropriate patterns like *Exception and debug messages) has modified coverage from 77.2% to 95%.
This commit is contained in:
parent
88fbac9755
commit
41b41ba316
|
@ -24,6 +24,8 @@ package net.sf.acegisecurity;
|
||||||
public interface ITargetObject {
|
public interface ITargetObject {
|
||||||
//~ Methods ================================================================
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public Integer computeHashCode(String input);
|
||||||
|
|
||||||
public int countLength(String input);
|
public int countLength(String input);
|
||||||
|
|
||||||
public String makeLowerCase(String input);
|
public String makeLowerCase(String input);
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
/* 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;
|
||||||
|
|
||||||
|
import net.sf.acegisecurity.acl.AclEntry;
|
||||||
|
import net.sf.acegisecurity.acl.AclManager;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the indicated collection of <code>AclEntry</code>s when the given
|
||||||
|
* <code>Authentication</code> principal is presented for the indicated domain
|
||||||
|
* <code>Object</code> instance.
|
||||||
|
*
|
||||||
|
* @author Ben Alex
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class MockAclManager implements AclManager {
|
||||||
|
//~ Instance fields ========================================================
|
||||||
|
|
||||||
|
private Object object;
|
||||||
|
private Object principal;
|
||||||
|
private AclEntry[] acls;
|
||||||
|
|
||||||
|
//~ Constructors ===========================================================
|
||||||
|
|
||||||
|
public MockAclManager(Object domainObject, Object principal, AclEntry[] acls) {
|
||||||
|
this.object = domainObject;
|
||||||
|
this.principal = principal;
|
||||||
|
this.acls = acls;
|
||||||
|
}
|
||||||
|
|
||||||
|
private MockAclManager() {}
|
||||||
|
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public AclEntry[] getAcls(Object domainInstance,
|
||||||
|
Authentication authentication) {
|
||||||
|
if (domainInstance.equals(object)
|
||||||
|
&& authentication.getPrincipal().equals(principal)) {
|
||||||
|
return acls;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AclEntry[] getAcls(Object domainInstance) {
|
||||||
|
if (domainInstance.equals(object)) {
|
||||||
|
return acls;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,60 @@
|
||||||
|
/* 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;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If there is a configuration attribute of "AFTER_INVOCATION_MOCK", modifies
|
||||||
|
* the return value to null.
|
||||||
|
*
|
||||||
|
* @author Ben Alex
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class MockAfterInvocationManager implements AfterInvocationManager {
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public Object decide(Authentication authentication, Object object,
|
||||||
|
ConfigAttributeDefinition config, Object returnedObject)
|
||||||
|
throws AccessDeniedException {
|
||||||
|
Iterator iter = config.getConfigAttributes();
|
||||||
|
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
ConfigAttribute attr = (ConfigAttribute) iter.next();
|
||||||
|
|
||||||
|
if (this.supports(attr)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// this "after invocation" hasn't got a config attribute asking
|
||||||
|
// for this mock to modify the returned object
|
||||||
|
return returnedObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean supports(ConfigAttribute attribute) {
|
||||||
|
if (attribute.getAttribute().equals("AFTER_INVOCATION_MOCK")) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean supports(Class clazz) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
/* 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;
|
||||||
|
|
||||||
|
import org.springframework.context.ConfigurableApplicationContext;
|
||||||
|
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simply returns an <code>ApplicationContext</code> which has a couple of
|
||||||
|
* <code>ApplicationEvent</code> listeners.
|
||||||
|
*
|
||||||
|
* @author Ben Alex
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class MockApplicationContext {
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public static ConfigurableApplicationContext getContext() {
|
||||||
|
return new ClassPathXmlApplicationContext(
|
||||||
|
"net/sf/acegisecurity/applicationContext.xml");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,162 @@
|
||||||
|
/* 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;
|
||||||
|
|
||||||
|
import org.aspectj.lang.JoinPoint;
|
||||||
|
import org.aspectj.lang.Signature;
|
||||||
|
import org.aspectj.lang.reflect.CodeSignature;
|
||||||
|
import org.aspectj.lang.reflect.SourceLocation;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A mock AspectJ <code>JoinPoint</code>.
|
||||||
|
*
|
||||||
|
* @author Ben Alex
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class MockJoinPoint implements JoinPoint {
|
||||||
|
//~ Instance fields ========================================================
|
||||||
|
|
||||||
|
private Method beingInvoked;
|
||||||
|
private Object object;
|
||||||
|
|
||||||
|
//~ Constructors ===========================================================
|
||||||
|
|
||||||
|
public MockJoinPoint(Object object, Method beingInvoked) {
|
||||||
|
this.object = object;
|
||||||
|
this.beingInvoked = beingInvoked;
|
||||||
|
}
|
||||||
|
|
||||||
|
private MockJoinPoint() {}
|
||||||
|
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public Object[] getArgs() {
|
||||||
|
throw new UnsupportedOperationException("mock not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getKind() {
|
||||||
|
throw new UnsupportedOperationException("mock not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
public Signature getSignature() {
|
||||||
|
throw new UnsupportedOperationException("mock not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
public SourceLocation getSourceLocation() {
|
||||||
|
throw new UnsupportedOperationException("mock not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
public StaticPart getStaticPart() {
|
||||||
|
return new MockStaticPart(beingInvoked);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getTarget() {
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getThis() {
|
||||||
|
throw new UnsupportedOperationException("mock not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toLongString() {
|
||||||
|
throw new UnsupportedOperationException("mock not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toShortString() {
|
||||||
|
throw new UnsupportedOperationException("mock not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Inner Classes ==========================================================
|
||||||
|
|
||||||
|
private class MockCodeSignature implements CodeSignature {
|
||||||
|
private Method beingInvoked;
|
||||||
|
|
||||||
|
public MockCodeSignature(Method beingInvoked) {
|
||||||
|
this.beingInvoked = beingInvoked;
|
||||||
|
}
|
||||||
|
|
||||||
|
private MockCodeSignature() {}
|
||||||
|
|
||||||
|
public Class getDeclaringType() {
|
||||||
|
throw new UnsupportedOperationException("mock not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDeclaringTypeName() {
|
||||||
|
throw new UnsupportedOperationException("mock not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class[] getExceptionTypes() {
|
||||||
|
throw new UnsupportedOperationException("mock not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getModifiers() {
|
||||||
|
throw new UnsupportedOperationException("mock not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return beingInvoked.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getParameterNames() {
|
||||||
|
throw new UnsupportedOperationException("mock not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class[] getParameterTypes() {
|
||||||
|
return beingInvoked.getParameterTypes();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toLongString() {
|
||||||
|
throw new UnsupportedOperationException("mock not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toShortString() {
|
||||||
|
throw new UnsupportedOperationException("mock not implemented");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class MockStaticPart implements StaticPart {
|
||||||
|
private Method beingInvoked;
|
||||||
|
|
||||||
|
public MockStaticPart(Method beingInvoked) {
|
||||||
|
this.beingInvoked = beingInvoked;
|
||||||
|
}
|
||||||
|
|
||||||
|
private MockStaticPart() {}
|
||||||
|
|
||||||
|
public String getKind() {
|
||||||
|
throw new UnsupportedOperationException("mock not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
public Signature getSignature() {
|
||||||
|
return new MockCodeSignature(beingInvoked);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SourceLocation getSourceLocation() {
|
||||||
|
throw new UnsupportedOperationException("mock not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toLongString() {
|
||||||
|
throw new UnsupportedOperationException("mock not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toShortString() {
|
||||||
|
throw new UnsupportedOperationException("mock not implemented");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -22,20 +22,34 @@ import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* DOCUMENT ME!
|
* Represents the AOP Alliance <code>MethodInvocation</code> secure object.
|
||||||
*
|
*
|
||||||
* @author Ben Alex
|
* @author Ben Alex
|
||||||
* @version $Id$
|
* @version $Id$
|
||||||
*/
|
*/
|
||||||
public class MockMethodInvocation implements MethodInvocation {
|
public class MockMethodInvocation implements MethodInvocation {
|
||||||
|
//~ Instance fields ========================================================
|
||||||
|
|
||||||
|
private Method method;
|
||||||
|
private Object[] arguments;
|
||||||
|
|
||||||
|
//~ Constructors ===========================================================
|
||||||
|
|
||||||
|
public MockMethodInvocation(Method method, Object[] arguments) {
|
||||||
|
this.method = method;
|
||||||
|
this.arguments = arguments;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MockMethodInvocation() {}
|
||||||
|
|
||||||
//~ Methods ================================================================
|
//~ Methods ================================================================
|
||||||
|
|
||||||
public Object[] getArguments() {
|
public Object[] getArguments() {
|
||||||
throw new UnsupportedOperationException("mock method not implemented");
|
return arguments;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Method getMethod() {
|
public Method getMethod() {
|
||||||
throw new UnsupportedOperationException("mock method not implemented");
|
return method;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AccessibleObject getStaticPart() {
|
public AccessibleObject getStaticPart() {
|
||||||
|
|
|
@ -47,7 +47,7 @@ public class MockRunAsManager implements RunAsManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean supports(ConfigAttribute attribute) {
|
public boolean supports(ConfigAttribute attribute) {
|
||||||
if ("RUN_AS".equals(attribute.getAttribute())) {
|
if (attribute.getAttribute().startsWith("RUN_AS")) {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -29,6 +29,10 @@ import net.sf.acegisecurity.context.SecureContext;
|
||||||
public class TargetObject implements ITargetObject {
|
public class TargetObject implements ITargetObject {
|
||||||
//~ Methods ================================================================
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public Integer computeHashCode(String input) {
|
||||||
|
return new Integer(input.hashCode());
|
||||||
|
}
|
||||||
|
|
||||||
public int countLength(String input) {
|
public int countLength(String input) {
|
||||||
return input.length();
|
return input.length();
|
||||||
}
|
}
|
||||||
|
|
|
@ -292,6 +292,11 @@ public class BasicAclProviderTests extends TestCase {
|
||||||
assertFalse(provider.supports(new MockDomain(4)));
|
assertFalse(provider.supports(new MockDomain(4)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testSupportsReturnsNullIfObjectNull() {
|
||||||
|
BasicAclProvider provider = new BasicAclProvider();
|
||||||
|
assertFalse(provider.supports(new Integer(34)));
|
||||||
|
}
|
||||||
|
|
||||||
private JdbcDaoImpl makePopulatedJdbcDao() throws Exception {
|
private JdbcDaoImpl makePopulatedJdbcDao() throws Exception {
|
||||||
JdbcDaoImpl dao = new JdbcDaoImpl();
|
JdbcDaoImpl dao = new JdbcDaoImpl();
|
||||||
dao.setDataSource(PopulatedDatabase.getDataSource());
|
dao.setDataSource(PopulatedDatabase.getDataSource());
|
||||||
|
|
|
@ -82,6 +82,10 @@ public class SimpleAclEntryTests extends TestCase {
|
||||||
assertFalse(acl.isPermitted(SimpleAclEntry.ADMINISTRATION));
|
assertFalse(acl.isPermitted(SimpleAclEntry.ADMINISTRATION));
|
||||||
acl.togglePermission(SimpleAclEntry.CREATE);
|
acl.togglePermission(SimpleAclEntry.CREATE);
|
||||||
assertFalse(acl.isPermitted(SimpleAclEntry.CREATE));
|
assertFalse(acl.isPermitted(SimpleAclEntry.CREATE));
|
||||||
|
|
||||||
|
acl.togglePermission(SimpleAclEntry.DELETE);
|
||||||
|
assertTrue(acl.isPermitted(SimpleAclEntry.DELETE));
|
||||||
|
assertEquals("----D", acl.printPermissionsBlock());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testDetectsNullOnMainConstructor() {
|
public void testDetectsNullOnMainConstructor() {
|
||||||
|
|
|
@ -0,0 +1,336 @@
|
||||||
|
/* 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.acl.basic.jdbc;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import net.sf.acegisecurity.PopulatedDatabase;
|
||||||
|
import net.sf.acegisecurity.acl.basic.AclObjectIdentity;
|
||||||
|
import net.sf.acegisecurity.acl.basic.BasicAclEntry;
|
||||||
|
import net.sf.acegisecurity.acl.basic.NamedEntityObjectIdentity;
|
||||||
|
import net.sf.acegisecurity.acl.basic.SimpleAclEntry;
|
||||||
|
|
||||||
|
import org.springframework.dao.DataIntegrityViolationException;
|
||||||
|
import org.springframework.dao.DataRetrievalFailureException;
|
||||||
|
|
||||||
|
import org.springframework.jdbc.object.MappingSqlQuery;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests {@link JdbcExtendedDaoImpl}.
|
||||||
|
*
|
||||||
|
* @author Ben Alex
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class JdbcExtendedDaoImplTests extends TestCase {
|
||||||
|
//~ Static fields/initializers =============================================
|
||||||
|
|
||||||
|
public static final String OBJECT_IDENTITY = "net.sf.acegisecurity.acl.DomainObject";
|
||||||
|
|
||||||
|
//~ Constructors ===========================================================
|
||||||
|
|
||||||
|
public JdbcExtendedDaoImplTests() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public JdbcExtendedDaoImplTests(String arg0) {
|
||||||
|
super(arg0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public final void setUp() throws Exception {
|
||||||
|
super.setUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
junit.textui.TestRunner.run(JdbcExtendedDaoImplTests.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testChangeMask() throws Exception {
|
||||||
|
JdbcExtendedDaoImpl dao = makePopulatedJdbcDao();
|
||||||
|
AclObjectIdentity identity = new NamedEntityObjectIdentity(OBJECT_IDENTITY,
|
||||||
|
"204");
|
||||||
|
AclObjectIdentity parentIdentity = new NamedEntityObjectIdentity(OBJECT_IDENTITY,
|
||||||
|
"1");
|
||||||
|
|
||||||
|
// Create a BasicAclEntry for this AclObjectIdentity
|
||||||
|
SimpleAclEntry simpleAcl1 = new SimpleAclEntry("marissa", identity,
|
||||||
|
parentIdentity, SimpleAclEntry.CREATE);
|
||||||
|
dao.create(simpleAcl1);
|
||||||
|
|
||||||
|
// Create another BasicAclEntry for this AclObjectIdentity
|
||||||
|
SimpleAclEntry simpleAcl2 = new SimpleAclEntry("scott", identity,
|
||||||
|
parentIdentity, SimpleAclEntry.READ);
|
||||||
|
dao.create(simpleAcl2);
|
||||||
|
|
||||||
|
// Check creation was successful
|
||||||
|
BasicAclEntry[] acls = dao.getAcls(identity);
|
||||||
|
assertEquals(2, acls.length);
|
||||||
|
assertEquals(SimpleAclEntry.CREATE, acls[0].getMask());
|
||||||
|
assertEquals(SimpleAclEntry.READ, acls[1].getMask());
|
||||||
|
|
||||||
|
// Attempt to change mask
|
||||||
|
dao.changeMask(identity, "marissa",
|
||||||
|
new Integer(SimpleAclEntry.ADMINISTRATION));
|
||||||
|
dao.changeMask(identity, "scott", new Integer(SimpleAclEntry.NOTHING));
|
||||||
|
acls = dao.getAcls(identity);
|
||||||
|
assertEquals(2, acls.length);
|
||||||
|
assertEquals("marissa", acls[0].getRecipient());
|
||||||
|
assertEquals(SimpleAclEntry.ADMINISTRATION, acls[0].getMask());
|
||||||
|
assertEquals("scott", acls[1].getRecipient());
|
||||||
|
assertEquals(SimpleAclEntry.NOTHING, acls[1].getMask());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testChangeMaskThrowsExceptionWhenExistingRecordNotFound()
|
||||||
|
throws Exception {
|
||||||
|
JdbcExtendedDaoImpl dao = makePopulatedJdbcDao();
|
||||||
|
AclObjectIdentity identity = new NamedEntityObjectIdentity(OBJECT_IDENTITY,
|
||||||
|
"205");
|
||||||
|
AclObjectIdentity parentIdentity = new NamedEntityObjectIdentity(OBJECT_IDENTITY,
|
||||||
|
"1");
|
||||||
|
|
||||||
|
// Create at least one record for this AclObjectIdentity
|
||||||
|
SimpleAclEntry simpleAcl1 = new SimpleAclEntry("marissa", identity,
|
||||||
|
parentIdentity, SimpleAclEntry.CREATE);
|
||||||
|
dao.create(simpleAcl1);
|
||||||
|
|
||||||
|
// Attempt to change mask, but for a recipient we don't have
|
||||||
|
try {
|
||||||
|
dao.changeMask(identity, "scott",
|
||||||
|
new Integer(SimpleAclEntry.ADMINISTRATION));
|
||||||
|
fail("Should have thrown DataRetrievalFailureException");
|
||||||
|
} catch (DataRetrievalFailureException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testConvertAclObjectIdentity() throws Exception {
|
||||||
|
JdbcExtendedDaoImpl dao = makePopulatedJdbcDao();
|
||||||
|
|
||||||
|
try {
|
||||||
|
dao.convertAclObjectIdentityToString(new AclObjectIdentity() {
|
||||||
|
// not a NamedEntityObjectIdentity
|
||||||
|
});
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCreationOfIdentityThenAclInSeparateInvocations()
|
||||||
|
throws Exception {
|
||||||
|
JdbcExtendedDaoImpl dao = makePopulatedJdbcDao();
|
||||||
|
AclObjectIdentity identity = new NamedEntityObjectIdentity(OBJECT_IDENTITY,
|
||||||
|
"206");
|
||||||
|
AclObjectIdentity parentIdentity = new NamedEntityObjectIdentity(OBJECT_IDENTITY,
|
||||||
|
"1");
|
||||||
|
|
||||||
|
// Create just the object identity (NB: recipient and mask is null)
|
||||||
|
SimpleAclEntry simpleAcl1 = new SimpleAclEntry();
|
||||||
|
simpleAcl1.setAclObjectIdentity(identity);
|
||||||
|
simpleAcl1.setAclObjectParentIdentity(parentIdentity);
|
||||||
|
dao.create(simpleAcl1);
|
||||||
|
|
||||||
|
// Delete it
|
||||||
|
dao.delete(identity);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testDeletionOfAllRecipients() throws Exception {
|
||||||
|
JdbcExtendedDaoImpl dao = makePopulatedJdbcDao();
|
||||||
|
AclObjectIdentity identity = new NamedEntityObjectIdentity(OBJECT_IDENTITY,
|
||||||
|
"203");
|
||||||
|
|
||||||
|
// Create a BasicAclEntry for this AclObjectIdentity
|
||||||
|
SimpleAclEntry simpleAcl1 = new SimpleAclEntry("marissa", identity,
|
||||||
|
null, SimpleAclEntry.CREATE);
|
||||||
|
dao.create(simpleAcl1);
|
||||||
|
|
||||||
|
// Create another BasicAclEntry for this AclObjectIdentity
|
||||||
|
SimpleAclEntry simpleAcl2 = new SimpleAclEntry("scott", identity, null,
|
||||||
|
SimpleAclEntry.READ);
|
||||||
|
dao.create(simpleAcl2);
|
||||||
|
|
||||||
|
// Check creation was successful
|
||||||
|
BasicAclEntry[] acls = dao.getAcls(identity);
|
||||||
|
assertEquals(2, acls.length);
|
||||||
|
|
||||||
|
// Attempt deletion and check delete successful
|
||||||
|
dao.delete(identity);
|
||||||
|
assertNull(dao.getAcls(identity));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testDeletionOfSpecificRecipient() throws Exception {
|
||||||
|
JdbcExtendedDaoImpl dao = makePopulatedJdbcDao();
|
||||||
|
AclObjectIdentity identity = new NamedEntityObjectIdentity(OBJECT_IDENTITY,
|
||||||
|
"202");
|
||||||
|
AclObjectIdentity parentIdentity = new NamedEntityObjectIdentity(OBJECT_IDENTITY,
|
||||||
|
"1");
|
||||||
|
|
||||||
|
// Create a BasicAclEntry for this AclObjectIdentity
|
||||||
|
SimpleAclEntry simpleAcl1 = new SimpleAclEntry("marissa", identity,
|
||||||
|
parentIdentity, SimpleAclEntry.CREATE);
|
||||||
|
dao.create(simpleAcl1);
|
||||||
|
|
||||||
|
// Create another BasicAclEntry for this AclObjectIdentity
|
||||||
|
SimpleAclEntry simpleAcl2 = new SimpleAclEntry("scott", identity,
|
||||||
|
parentIdentity, SimpleAclEntry.READ);
|
||||||
|
dao.create(simpleAcl2);
|
||||||
|
|
||||||
|
// Check creation was successful
|
||||||
|
BasicAclEntry[] acls = dao.getAcls(identity);
|
||||||
|
assertEquals(2, acls.length);
|
||||||
|
|
||||||
|
// Attempt deletion and check delete successful
|
||||||
|
dao.delete(identity, "scott");
|
||||||
|
acls = dao.getAcls(identity);
|
||||||
|
assertEquals(1, acls.length);
|
||||||
|
assertEquals(simpleAcl1.getRecipient(), acls[0].getRecipient());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testGettersSetters() throws Exception {
|
||||||
|
JdbcExtendedDaoImpl dao = makePopulatedJdbcDao();
|
||||||
|
|
||||||
|
assertNotNull(dao.getAclObjectIdentityDelete());
|
||||||
|
dao.setAclObjectIdentityDelete(null);
|
||||||
|
assertNull(dao.getAclObjectIdentityDelete());
|
||||||
|
|
||||||
|
assertNotNull(dao.getAclObjectIdentityInsert());
|
||||||
|
dao.setAclObjectIdentityInsert(null);
|
||||||
|
assertNull(dao.getAclObjectIdentityInsert());
|
||||||
|
|
||||||
|
assertNotNull(dao.getAclPermissionDelete());
|
||||||
|
dao.setAclPermissionDelete(null);
|
||||||
|
assertNull(dao.getAclPermissionDelete());
|
||||||
|
|
||||||
|
assertNotNull(dao.getAclPermissionInsert());
|
||||||
|
dao.setAclPermissionInsert(null);
|
||||||
|
assertNull(dao.getAclPermissionInsert());
|
||||||
|
|
||||||
|
assertNotNull(dao.getAclPermissionUpdate());
|
||||||
|
dao.setAclPermissionUpdate(null);
|
||||||
|
assertNull(dao.getAclPermissionUpdate());
|
||||||
|
|
||||||
|
assertNotNull(dao.getAclsByObjectIdentity());
|
||||||
|
dao.setAclsByObjectIdentity(null);
|
||||||
|
assertNull(dao.getAclsByObjectIdentity());
|
||||||
|
|
||||||
|
assertNotNull(dao.getLookupPermissionIdMapping());
|
||||||
|
dao.setLookupPermissionIdMapping(null);
|
||||||
|
assertNull(dao.getLookupPermissionIdMapping());
|
||||||
|
|
||||||
|
assertNotNull(dao.getAclObjectIdentityDeleteStatement());
|
||||||
|
dao.setAclObjectIdentityDeleteStatement("SELECT ...");
|
||||||
|
assertEquals("SELECT ...", dao.getAclObjectIdentityDeleteStatement());
|
||||||
|
|
||||||
|
assertNotNull(dao.getAclObjectIdentityInsertStatement());
|
||||||
|
dao.setAclObjectIdentityInsertStatement("SELECT ...");
|
||||||
|
assertEquals("SELECT ...", dao.getAclObjectIdentityInsertStatement());
|
||||||
|
|
||||||
|
assertNotNull(dao.getAclPermissionDeleteStatement());
|
||||||
|
dao.setAclPermissionDeleteStatement("SELECT ...");
|
||||||
|
assertEquals("SELECT ...", dao.getAclPermissionDeleteStatement());
|
||||||
|
|
||||||
|
assertNotNull(dao.getAclPermissionInsertStatement());
|
||||||
|
dao.setAclPermissionInsertStatement("SELECT ...");
|
||||||
|
assertEquals("SELECT ...", dao.getAclPermissionInsertStatement());
|
||||||
|
|
||||||
|
assertNotNull(dao.getAclPermissionUpdateStatement());
|
||||||
|
dao.setAclPermissionUpdateStatement("SELECT ...");
|
||||||
|
assertEquals("SELECT ...", dao.getAclPermissionUpdateStatement());
|
||||||
|
|
||||||
|
assertNotNull(dao.getAclsByObjectIdentityQuery());
|
||||||
|
dao.setAclsByObjectIdentityQuery("SELECT ...");
|
||||||
|
assertEquals("SELECT ...", dao.getAclsByObjectIdentityQuery());
|
||||||
|
|
||||||
|
assertNotNull(dao.getLookupPermissionIdQuery());
|
||||||
|
dao.setLookupPermissionIdQuery("SELECT ...");
|
||||||
|
assertEquals("SELECT ...", dao.getLookupPermissionIdQuery());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testNormalCreationAndDuplicateDetection()
|
||||||
|
throws Exception {
|
||||||
|
JdbcExtendedDaoImpl dao = makePopulatedJdbcDao();
|
||||||
|
AclObjectIdentity identity = new NamedEntityObjectIdentity(OBJECT_IDENTITY,
|
||||||
|
"200");
|
||||||
|
AclObjectIdentity parentIdentity = new NamedEntityObjectIdentity(OBJECT_IDENTITY,
|
||||||
|
"1");
|
||||||
|
|
||||||
|
// Create a BasicAclEntry for this AclObjectIdentity
|
||||||
|
SimpleAclEntry simpleAcl1 = new SimpleAclEntry("marissa", identity,
|
||||||
|
parentIdentity, SimpleAclEntry.CREATE);
|
||||||
|
dao.create(simpleAcl1);
|
||||||
|
|
||||||
|
// Create another BasicAclEntry for this AclObjectIdentity
|
||||||
|
SimpleAclEntry simpleAcl2 = new SimpleAclEntry("scott", identity,
|
||||||
|
parentIdentity, SimpleAclEntry.READ);
|
||||||
|
dao.create(simpleAcl2);
|
||||||
|
|
||||||
|
// Check creation was successful
|
||||||
|
BasicAclEntry[] acls = dao.getAcls(identity);
|
||||||
|
assertEquals(2, acls.length);
|
||||||
|
assertEquals(simpleAcl1.getRecipient(), acls[0].getRecipient());
|
||||||
|
assertEquals(simpleAcl1.getMask(), acls[0].getMask());
|
||||||
|
assertEquals(simpleAcl2.getRecipient(), acls[1].getRecipient());
|
||||||
|
assertEquals(simpleAcl2.getMask(), acls[1].getMask());
|
||||||
|
|
||||||
|
// Check it rejects an attempt to create another identical entry
|
||||||
|
try {
|
||||||
|
dao.create(simpleAcl1);
|
||||||
|
fail("Should have thrown DataIntegrityViolationException");
|
||||||
|
} catch (DataIntegrityViolationException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testRejectsInvalidParent() throws Exception {
|
||||||
|
JdbcExtendedDaoImpl dao = makePopulatedJdbcDao();
|
||||||
|
AclObjectIdentity identity = new NamedEntityObjectIdentity(OBJECT_IDENTITY,
|
||||||
|
"201");
|
||||||
|
AclObjectIdentity parentIdentity = new NamedEntityObjectIdentity(OBJECT_IDENTITY,
|
||||||
|
"987987987987986");
|
||||||
|
SimpleAclEntry simpleAcl = new SimpleAclEntry("marissa", identity,
|
||||||
|
parentIdentity, SimpleAclEntry.CREATE);
|
||||||
|
|
||||||
|
try {
|
||||||
|
dao.create(simpleAcl);
|
||||||
|
fail("Should have thrown DataRetrievalFailureException");
|
||||||
|
} catch (DataRetrievalFailureException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private JdbcExtendedDaoImpl makePopulatedJdbcDao()
|
||||||
|
throws Exception {
|
||||||
|
JdbcExtendedDaoImpl dao = new JdbcExtendedDaoImpl();
|
||||||
|
dao.setDataSource(PopulatedDatabase.getDataSource());
|
||||||
|
dao.afterPropertiesSet();
|
||||||
|
|
||||||
|
return dao;
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Inner Classes ==========================================================
|
||||||
|
|
||||||
|
private class MockMappingSqlQuery extends MappingSqlQuery {
|
||||||
|
protected Object mapRow(ResultSet arg0, int arg1)
|
||||||
|
throws SQLException {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,223 @@
|
||||||
|
/* 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.afterinvocation;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import net.sf.acegisecurity.AccessDeniedException;
|
||||||
|
import net.sf.acegisecurity.Authentication;
|
||||||
|
import net.sf.acegisecurity.ConfigAttribute;
|
||||||
|
import net.sf.acegisecurity.ConfigAttributeDefinition;
|
||||||
|
import net.sf.acegisecurity.MockMethodInvocation;
|
||||||
|
import net.sf.acegisecurity.SecurityConfig;
|
||||||
|
import net.sf.acegisecurity.intercept.web.FilterInvocation;
|
||||||
|
|
||||||
|
import org.aopalliance.intercept.MethodInvocation;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests {@link AfterInvocationProviderManager}.
|
||||||
|
*
|
||||||
|
* @author Ben Alex
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class AfterInvocationProviderManagerTests extends TestCase {
|
||||||
|
//~ Constructors ===========================================================
|
||||||
|
|
||||||
|
public AfterInvocationProviderManagerTests() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public AfterInvocationProviderManagerTests(String arg0) {
|
||||||
|
super(arg0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public final void setUp() throws Exception {
|
||||||
|
super.setUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
junit.textui.TestRunner.run(AfterInvocationProviderManagerTests.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCorrectOperation() throws Exception {
|
||||||
|
AfterInvocationProviderManager manager = new AfterInvocationProviderManager();
|
||||||
|
List list = new Vector();
|
||||||
|
list.add(new MockAfterInvocationProvider("swap1",
|
||||||
|
MethodInvocation.class, new SecurityConfig("GIVE_ME_SWAP1")));
|
||||||
|
list.add(new MockAfterInvocationProvider("swap2",
|
||||||
|
MethodInvocation.class, new SecurityConfig("GIVE_ME_SWAP2")));
|
||||||
|
list.add(new MockAfterInvocationProvider("swap3",
|
||||||
|
MethodInvocation.class, new SecurityConfig("GIVE_ME_SWAP3")));
|
||||||
|
manager.setProviders(list);
|
||||||
|
assertEquals(list, manager.getProviders());
|
||||||
|
manager.afterPropertiesSet();
|
||||||
|
|
||||||
|
ConfigAttributeDefinition attr1 = new ConfigAttributeDefinition();
|
||||||
|
attr1.addConfigAttribute(new SecurityConfig("GIVE_ME_SWAP1"));
|
||||||
|
|
||||||
|
ConfigAttributeDefinition attr2 = new ConfigAttributeDefinition();
|
||||||
|
attr2.addConfigAttribute(new SecurityConfig("GIVE_ME_SWAP2"));
|
||||||
|
|
||||||
|
ConfigAttributeDefinition attr3 = new ConfigAttributeDefinition();
|
||||||
|
attr3.addConfigAttribute(new SecurityConfig("GIVE_ME_SWAP3"));
|
||||||
|
|
||||||
|
ConfigAttributeDefinition attr2and3 = new ConfigAttributeDefinition();
|
||||||
|
attr2and3.addConfigAttribute(new SecurityConfig("GIVE_ME_SWAP2"));
|
||||||
|
attr2and3.addConfigAttribute(new SecurityConfig("GIVE_ME_SWAP3"));
|
||||||
|
|
||||||
|
ConfigAttributeDefinition attr4 = new ConfigAttributeDefinition();
|
||||||
|
attr4.addConfigAttribute(new SecurityConfig("NEVER_CAUSES_SWAP"));
|
||||||
|
|
||||||
|
assertEquals("swap1",
|
||||||
|
manager.decide(null, new MockMethodInvocation(), attr1,
|
||||||
|
"content-before-swapping"));
|
||||||
|
|
||||||
|
assertEquals("swap2",
|
||||||
|
manager.decide(null, new MockMethodInvocation(), attr2,
|
||||||
|
"content-before-swapping"));
|
||||||
|
|
||||||
|
assertEquals("swap3",
|
||||||
|
manager.decide(null, new MockMethodInvocation(), attr3,
|
||||||
|
"content-before-swapping"));
|
||||||
|
|
||||||
|
assertEquals("content-before-swapping",
|
||||||
|
manager.decide(null, new MockMethodInvocation(), attr4,
|
||||||
|
"content-before-swapping"));
|
||||||
|
|
||||||
|
assertEquals("swap3",
|
||||||
|
manager.decide(null, new MockMethodInvocation(), attr2and3,
|
||||||
|
"content-before-swapping"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testRejectsEmptyProvidersList() {
|
||||||
|
AfterInvocationProviderManager manager = new AfterInvocationProviderManager();
|
||||||
|
List list = new Vector();
|
||||||
|
|
||||||
|
try {
|
||||||
|
manager.setProviders(list);
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testRejectsNonAfterInvocationProviders() {
|
||||||
|
AfterInvocationProviderManager manager = new AfterInvocationProviderManager();
|
||||||
|
List list = new Vector();
|
||||||
|
list.add(new MockAfterInvocationProvider("swap1",
|
||||||
|
MethodInvocation.class, new SecurityConfig("GIVE_ME_SWAP1")));
|
||||||
|
list.add(new Integer(45));
|
||||||
|
list.add(new MockAfterInvocationProvider("swap3",
|
||||||
|
MethodInvocation.class, new SecurityConfig("GIVE_ME_SWAP3")));
|
||||||
|
|
||||||
|
try {
|
||||||
|
manager.setProviders(list);
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testRejectsNullProvidersList() throws Exception {
|
||||||
|
AfterInvocationProviderManager manager = new AfterInvocationProviderManager();
|
||||||
|
|
||||||
|
try {
|
||||||
|
manager.afterPropertiesSet();
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testSupportsConfigAttributeIteration()
|
||||||
|
throws Exception {
|
||||||
|
AfterInvocationProviderManager manager = new AfterInvocationProviderManager();
|
||||||
|
List list = new Vector();
|
||||||
|
list.add(new MockAfterInvocationProvider("swap1",
|
||||||
|
MethodInvocation.class, new SecurityConfig("GIVE_ME_SWAP1")));
|
||||||
|
list.add(new MockAfterInvocationProvider("swap2",
|
||||||
|
MethodInvocation.class, new SecurityConfig("GIVE_ME_SWAP2")));
|
||||||
|
list.add(new MockAfterInvocationProvider("swap3",
|
||||||
|
MethodInvocation.class, new SecurityConfig("GIVE_ME_SWAP3")));
|
||||||
|
manager.setProviders(list);
|
||||||
|
manager.afterPropertiesSet();
|
||||||
|
|
||||||
|
assertFalse(manager.supports(new SecurityConfig("UNKNOWN_ATTRIB")));
|
||||||
|
assertTrue(manager.supports(new SecurityConfig("GIVE_ME_SWAP2")));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testSupportsSecureObjectIteration() throws Exception {
|
||||||
|
AfterInvocationProviderManager manager = new AfterInvocationProviderManager();
|
||||||
|
List list = new Vector();
|
||||||
|
list.add(new MockAfterInvocationProvider("swap1",
|
||||||
|
MethodInvocation.class, new SecurityConfig("GIVE_ME_SWAP1")));
|
||||||
|
list.add(new MockAfterInvocationProvider("swap2",
|
||||||
|
MethodInvocation.class, new SecurityConfig("GIVE_ME_SWAP2")));
|
||||||
|
list.add(new MockAfterInvocationProvider("swap3",
|
||||||
|
MethodInvocation.class, new SecurityConfig("GIVE_ME_SWAP3")));
|
||||||
|
manager.setProviders(list);
|
||||||
|
manager.afterPropertiesSet();
|
||||||
|
|
||||||
|
assertFalse(manager.supports(FilterInvocation.class));
|
||||||
|
assertTrue(manager.supports(MethodInvocation.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Inner Classes ==========================================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Always returns the constructor-defined <code>forceReturnObject</code>,
|
||||||
|
* provided the same configuration attribute was provided. Also stores the
|
||||||
|
* secure object it supports.
|
||||||
|
*/
|
||||||
|
private class MockAfterInvocationProvider implements AfterInvocationProvider {
|
||||||
|
private Class secureObject;
|
||||||
|
private ConfigAttribute configAttribute;
|
||||||
|
private Object forceReturnObject;
|
||||||
|
|
||||||
|
public MockAfterInvocationProvider(Object forceReturnObject,
|
||||||
|
Class secureObject, ConfigAttribute configAttribute) {
|
||||||
|
this.forceReturnObject = forceReturnObject;
|
||||||
|
this.secureObject = secureObject;
|
||||||
|
this.configAttribute = configAttribute;
|
||||||
|
}
|
||||||
|
|
||||||
|
private MockAfterInvocationProvider() {}
|
||||||
|
|
||||||
|
public Object decide(Authentication authentication, Object object,
|
||||||
|
ConfigAttributeDefinition config, Object returnedObject)
|
||||||
|
throws AccessDeniedException {
|
||||||
|
if (config.contains(configAttribute)) {
|
||||||
|
return forceReturnObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
return returnedObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean supports(Class clazz) {
|
||||||
|
return secureObject.isAssignableFrom(clazz);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean supports(ConfigAttribute attribute) {
|
||||||
|
return attribute.equals(configAttribute);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,373 @@
|
||||||
|
/* 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.afterinvocation;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import net.sf.acegisecurity.AuthorizationServiceException;
|
||||||
|
import net.sf.acegisecurity.ConfigAttributeDefinition;
|
||||||
|
import net.sf.acegisecurity.MockAclManager;
|
||||||
|
import net.sf.acegisecurity.MockMethodInvocation;
|
||||||
|
import net.sf.acegisecurity.SecurityConfig;
|
||||||
|
import net.sf.acegisecurity.acl.AclEntry;
|
||||||
|
import net.sf.acegisecurity.acl.AclManager;
|
||||||
|
import net.sf.acegisecurity.acl.basic.MockAclObjectIdentity;
|
||||||
|
import net.sf.acegisecurity.acl.basic.SimpleAclEntry;
|
||||||
|
import net.sf.acegisecurity.providers.UsernamePasswordAuthenticationToken;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests {@link BasicAclEntryAfterInvocationCollectionFilteringProvider}.
|
||||||
|
*
|
||||||
|
* @author Ben Alex
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class BasicAclEntryAfterInvocationCollectionFilteringProviderTests
|
||||||
|
extends TestCase {
|
||||||
|
//~ Constructors ===========================================================
|
||||||
|
|
||||||
|
public BasicAclEntryAfterInvocationCollectionFilteringProviderTests() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public BasicAclEntryAfterInvocationCollectionFilteringProviderTests(
|
||||||
|
String arg0) {
|
||||||
|
super(arg0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public final void setUp() throws Exception {
|
||||||
|
super.setUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
junit.textui.TestRunner.run(BasicAclEntryAfterInvocationCollectionFilteringProviderTests.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCorrectOperationWhenPrincipalHasIncorrectPermissionToDomainObject()
|
||||||
|
throws Exception {
|
||||||
|
// Create an AclManager, granting scott only ADMINISTRATION rights
|
||||||
|
AclManager aclManager = new MockAclManager("belmont", "scott",
|
||||||
|
new AclEntry[] {new SimpleAclEntry("scott",
|
||||||
|
new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION)});
|
||||||
|
|
||||||
|
BasicAclEntryAfterInvocationCollectionFilteringProvider provider = new BasicAclEntryAfterInvocationCollectionFilteringProvider();
|
||||||
|
provider.setAclManager(aclManager);
|
||||||
|
provider.afterPropertiesSet();
|
||||||
|
|
||||||
|
// Create a Collection containing many items
|
||||||
|
List list = new Vector();
|
||||||
|
list.add("sydney");
|
||||||
|
list.add("melbourne");
|
||||||
|
list.add("belmont");
|
||||||
|
list.add("brisbane");
|
||||||
|
|
||||||
|
// Create the Authentication and Config Attribs we'll be presenting
|
||||||
|
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("scott",
|
||||||
|
"NOT_USED");
|
||||||
|
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||||
|
attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_COLLECTION_READ"));
|
||||||
|
|
||||||
|
// Filter
|
||||||
|
List filteredList = (List) provider.decide(auth,
|
||||||
|
new MockMethodInvocation(), attr, list);
|
||||||
|
|
||||||
|
assertEquals(0, filteredList.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCorrectOperationWhenPrincipalHasNoPermissionToDomainObject()
|
||||||
|
throws Exception {
|
||||||
|
// Create an AclManager
|
||||||
|
AclManager aclManager = new MockAclManager("belmont", "marissa",
|
||||||
|
new AclEntry[] {new MockAclEntry(), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.READ), new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)});
|
||||||
|
|
||||||
|
BasicAclEntryAfterInvocationCollectionFilteringProvider provider = new BasicAclEntryAfterInvocationCollectionFilteringProvider();
|
||||||
|
provider.setAclManager(aclManager);
|
||||||
|
provider.afterPropertiesSet();
|
||||||
|
|
||||||
|
// Create a Collection containing many items, which only "belmont"
|
||||||
|
// should remain in after filtering by provider
|
||||||
|
List list = new Vector();
|
||||||
|
list.add("sydney");
|
||||||
|
list.add("melbourne");
|
||||||
|
list.add("belmont");
|
||||||
|
list.add("brisbane");
|
||||||
|
|
||||||
|
// Create the Authentication and Config Attribs we'll be presenting
|
||||||
|
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("scott",
|
||||||
|
"NOT_USED");
|
||||||
|
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||||
|
attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_COLLECTION_READ"));
|
||||||
|
|
||||||
|
// Filter
|
||||||
|
List filteredList = (List) provider.decide(auth,
|
||||||
|
new MockMethodInvocation(), attr, list);
|
||||||
|
|
||||||
|
assertEquals(0, filteredList.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCorrectOperationWhenPrincipalIsAuthorised()
|
||||||
|
throws Exception {
|
||||||
|
// Create an AclManager
|
||||||
|
AclManager aclManager = new MockAclManager("belmont", "marissa",
|
||||||
|
new AclEntry[] {new MockAclEntry(), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.READ), new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)});
|
||||||
|
|
||||||
|
BasicAclEntryAfterInvocationCollectionFilteringProvider provider = new BasicAclEntryAfterInvocationCollectionFilteringProvider();
|
||||||
|
provider.setAclManager(aclManager);
|
||||||
|
assertEquals(aclManager, provider.getAclManager());
|
||||||
|
provider.afterPropertiesSet();
|
||||||
|
|
||||||
|
// Create a Collection containing many items, which only "belmont"
|
||||||
|
// should remain in after filtering by provider
|
||||||
|
List list = new Vector();
|
||||||
|
list.add("sydney");
|
||||||
|
list.add("melbourne");
|
||||||
|
list.add("belmont");
|
||||||
|
list.add("brisbane");
|
||||||
|
|
||||||
|
// Create the Authentication and Config Attribs we'll be presenting
|
||||||
|
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("marissa",
|
||||||
|
"NOT_USED");
|
||||||
|
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||||
|
attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_COLLECTION_READ"));
|
||||||
|
|
||||||
|
// Filter
|
||||||
|
List filteredList = (List) provider.decide(auth,
|
||||||
|
new MockMethodInvocation(), attr, list);
|
||||||
|
|
||||||
|
assertEquals(1, filteredList.size());
|
||||||
|
assertEquals("belmont", filteredList.get(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testDetectsIfReturnedObjectIsNotACollection()
|
||||||
|
throws Exception {
|
||||||
|
// Create an AclManager
|
||||||
|
AclManager aclManager = new MockAclManager("belmont", "marissa",
|
||||||
|
new AclEntry[] {new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.READ), new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE), new MockAclEntry()});
|
||||||
|
|
||||||
|
BasicAclEntryAfterInvocationCollectionFilteringProvider provider = new BasicAclEntryAfterInvocationCollectionFilteringProvider();
|
||||||
|
provider.setAclManager(aclManager);
|
||||||
|
provider.afterPropertiesSet();
|
||||||
|
|
||||||
|
// Create the Authentication and Config Attribs we'll be presenting
|
||||||
|
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("marissa",
|
||||||
|
"NOT_USED");
|
||||||
|
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||||
|
attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_COLLECTION_READ"));
|
||||||
|
|
||||||
|
// Filter
|
||||||
|
try {
|
||||||
|
provider.decide(auth, new MockMethodInvocation(), attr,
|
||||||
|
new String("RETURN_OBJECT_NOT_COLLECTION"));
|
||||||
|
fail("Should have thrown AuthorizationServiceException");
|
||||||
|
} catch (AuthorizationServiceException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testGrantsAccessIfReturnedObjectIsNull()
|
||||||
|
throws Exception {
|
||||||
|
// Create an AclManager
|
||||||
|
AclManager aclManager = new MockAclManager("belmont", "marissa",
|
||||||
|
new AclEntry[] {new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.READ), new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE), new MockAclEntry()});
|
||||||
|
|
||||||
|
BasicAclEntryAfterInvocationCollectionFilteringProvider provider = new BasicAclEntryAfterInvocationCollectionFilteringProvider();
|
||||||
|
provider.setAclManager(aclManager);
|
||||||
|
provider.afterPropertiesSet();
|
||||||
|
|
||||||
|
// Create the Authentication and Config Attribs we'll be presenting
|
||||||
|
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("marissa",
|
||||||
|
"NOT_USED");
|
||||||
|
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||||
|
attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_COLLECTION_READ"));
|
||||||
|
|
||||||
|
// Filter
|
||||||
|
List filteredList = (List) provider.decide(auth,
|
||||||
|
new MockMethodInvocation(), attr, null);
|
||||||
|
|
||||||
|
assertNull(filteredList);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testRespectsModificationsToProcessConfigAttribute()
|
||||||
|
throws Exception {
|
||||||
|
// Create an AclManager
|
||||||
|
AclManager aclManager = new MockAclManager("sydney", "marissa",
|
||||||
|
new AclEntry[] {new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null, SimpleAclEntry.READ), new MockAclEntry()});
|
||||||
|
|
||||||
|
BasicAclEntryAfterInvocationCollectionFilteringProvider provider = new BasicAclEntryAfterInvocationCollectionFilteringProvider();
|
||||||
|
provider.setAclManager(aclManager);
|
||||||
|
assertEquals("AFTER_ACL_COLLECTION_READ",
|
||||||
|
provider.getProcessConfigAttribute());
|
||||||
|
provider.setProcessConfigAttribute("AFTER_ACL_COLLECTION_ADMIN");
|
||||||
|
assertEquals("AFTER_ACL_COLLECTION_ADMIN",
|
||||||
|
provider.getProcessConfigAttribute());
|
||||||
|
provider.afterPropertiesSet();
|
||||||
|
|
||||||
|
// Create a Collection containing many items, which only "sydney"
|
||||||
|
// should remain in after filtering by provider
|
||||||
|
List list = new Vector();
|
||||||
|
list.add("sydney");
|
||||||
|
list.add("melbourne");
|
||||||
|
list.add("belmont");
|
||||||
|
list.add("brisbane");
|
||||||
|
|
||||||
|
// Create the Authentication and Config Attribs we'll be presenting
|
||||||
|
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("marissa",
|
||||||
|
"NOT_USED");
|
||||||
|
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||||
|
attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_COLLECTION_READ"));
|
||||||
|
|
||||||
|
// As no matching config attrib, ensure provider doesn't change list
|
||||||
|
assertEquals(4,
|
||||||
|
((List) provider.decide(auth, new MockMethodInvocation(), attr, list))
|
||||||
|
.size());
|
||||||
|
|
||||||
|
// Filter, this time with the conf attrib provider setup to answer
|
||||||
|
attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_COLLECTION_ADMIN"));
|
||||||
|
|
||||||
|
List filteredList = (List) provider.decide(auth,
|
||||||
|
new MockMethodInvocation(), attr, list);
|
||||||
|
|
||||||
|
assertEquals(1, filteredList.size());
|
||||||
|
assertEquals("sydney", filteredList.get(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testRespectsModificationsToRequirePermissions()
|
||||||
|
throws Exception {
|
||||||
|
// Create an AclManager
|
||||||
|
AclManager aclManager = new MockAclManager("sydney", "marissa",
|
||||||
|
new AclEntry[] {new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION), new MockAclEntry()});
|
||||||
|
|
||||||
|
BasicAclEntryAfterInvocationCollectionFilteringProvider provider = new BasicAclEntryAfterInvocationCollectionFilteringProvider();
|
||||||
|
provider.setAclManager(aclManager);
|
||||||
|
assertEquals(SimpleAclEntry.READ, provider.getRequirePermission()[0]);
|
||||||
|
provider.setRequirePermission(new int[] {SimpleAclEntry.ADMINISTRATION});
|
||||||
|
assertEquals(SimpleAclEntry.ADMINISTRATION,
|
||||||
|
provider.getRequirePermission()[0]);
|
||||||
|
provider.afterPropertiesSet();
|
||||||
|
|
||||||
|
// Create a Collection containing many items, which only "sydney"
|
||||||
|
// should remain in after filtering by provider
|
||||||
|
List list = new Vector();
|
||||||
|
list.add("sydney");
|
||||||
|
list.add("melbourne");
|
||||||
|
list.add("belmont");
|
||||||
|
list.add("brisbane");
|
||||||
|
|
||||||
|
// Create the Authentication and Config Attribs we'll be presenting
|
||||||
|
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("marissa",
|
||||||
|
"NOT_USED");
|
||||||
|
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||||
|
attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_COLLECTION_READ"));
|
||||||
|
|
||||||
|
// Filter
|
||||||
|
List filteredList = (List) provider.decide(auth,
|
||||||
|
new MockMethodInvocation(), attr, list);
|
||||||
|
|
||||||
|
assertEquals(1, filteredList.size());
|
||||||
|
assertEquals("sydney", filteredList.get(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testStartupDetectsMissingAclManager() throws Exception {
|
||||||
|
BasicAclEntryAfterInvocationCollectionFilteringProvider provider = new BasicAclEntryAfterInvocationCollectionFilteringProvider();
|
||||||
|
|
||||||
|
try {
|
||||||
|
provider.afterPropertiesSet();
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertEquals("An aclManager is mandatory", expected.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testStartupDetectsMissingProcessConfigAttribute()
|
||||||
|
throws Exception {
|
||||||
|
BasicAclEntryAfterInvocationCollectionFilteringProvider provider = new BasicAclEntryAfterInvocationCollectionFilteringProvider();
|
||||||
|
AclManager aclManager = new MockAclManager("sydney", "marissa",
|
||||||
|
new AclEntry[] {new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION), new MockAclEntry()});
|
||||||
|
provider.setAclManager(aclManager);
|
||||||
|
|
||||||
|
provider.setProcessConfigAttribute(null);
|
||||||
|
|
||||||
|
try {
|
||||||
|
provider.afterPropertiesSet();
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertEquals("A processConfigAttribute is mandatory",
|
||||||
|
expected.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testStartupDetectsMissingRequirePermission()
|
||||||
|
throws Exception {
|
||||||
|
BasicAclEntryAfterInvocationCollectionFilteringProvider provider = new BasicAclEntryAfterInvocationCollectionFilteringProvider();
|
||||||
|
AclManager aclManager = new MockAclManager("sydney", "marissa",
|
||||||
|
new AclEntry[] {new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION), new MockAclEntry()});
|
||||||
|
provider.setAclManager(aclManager);
|
||||||
|
|
||||||
|
provider.setRequirePermission(null);
|
||||||
|
|
||||||
|
try {
|
||||||
|
provider.afterPropertiesSet();
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertEquals("One or more requirePermission entries is mandatory",
|
||||||
|
expected.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testSupportsAnything() {
|
||||||
|
assertTrue(new BasicAclEntryAfterInvocationCollectionFilteringProvider()
|
||||||
|
.supports(String.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Inner Classes ==========================================================
|
||||||
|
|
||||||
|
private class MockAclEntry implements AclEntry {
|
||||||
|
// just so AclTag iterates some different types of AclEntrys
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,284 @@
|
||||||
|
/* 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.afterinvocation;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import net.sf.acegisecurity.AccessDeniedException;
|
||||||
|
import net.sf.acegisecurity.ConfigAttributeDefinition;
|
||||||
|
import net.sf.acegisecurity.MockAclManager;
|
||||||
|
import net.sf.acegisecurity.MockMethodInvocation;
|
||||||
|
import net.sf.acegisecurity.SecurityConfig;
|
||||||
|
import net.sf.acegisecurity.acl.AclEntry;
|
||||||
|
import net.sf.acegisecurity.acl.AclManager;
|
||||||
|
import net.sf.acegisecurity.acl.basic.MockAclObjectIdentity;
|
||||||
|
import net.sf.acegisecurity.acl.basic.SimpleAclEntry;
|
||||||
|
import net.sf.acegisecurity.providers.UsernamePasswordAuthenticationToken;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests {@link BasicAclEntryAfterInvocationProvider}.
|
||||||
|
*
|
||||||
|
* @author Ben Alex
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class BasicAclEntryAfterInvocationProviderTests extends TestCase {
|
||||||
|
//~ Constructors ===========================================================
|
||||||
|
|
||||||
|
public BasicAclEntryAfterInvocationProviderTests() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public BasicAclEntryAfterInvocationProviderTests(String arg0) {
|
||||||
|
super(arg0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public final void setUp() throws Exception {
|
||||||
|
super.setUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
junit.textui.TestRunner.run(BasicAclEntryAfterInvocationProviderTests.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCorrectOperationWhenPrincipalHasIncorrectPermissionToDomainObject()
|
||||||
|
throws Exception {
|
||||||
|
// Create an AclManager, granting scott only ADMINISTRATION rights
|
||||||
|
AclManager aclManager = new MockAclManager("belmont", "scott",
|
||||||
|
new AclEntry[] {new SimpleAclEntry("scott",
|
||||||
|
new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION)});
|
||||||
|
|
||||||
|
BasicAclEntryAfterInvocationProvider provider = new BasicAclEntryAfterInvocationProvider();
|
||||||
|
provider.setAclManager(aclManager);
|
||||||
|
provider.afterPropertiesSet();
|
||||||
|
|
||||||
|
// Create the Authentication and Config Attribs we'll be presenting
|
||||||
|
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("scott",
|
||||||
|
"NOT_USED");
|
||||||
|
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||||
|
attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_READ"));
|
||||||
|
|
||||||
|
try {
|
||||||
|
provider.decide(auth, new MockMethodInvocation(), attr, "belmont");
|
||||||
|
fail("Should have thrown AccessDeniedException");
|
||||||
|
} catch (AccessDeniedException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCorrectOperationWhenPrincipalHasNoPermissionToDomainObject()
|
||||||
|
throws Exception {
|
||||||
|
// Create an AclManager
|
||||||
|
AclManager aclManager = new MockAclManager("belmont", "marissa",
|
||||||
|
new AclEntry[] {new MockAclEntry(), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.READ), new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)});
|
||||||
|
|
||||||
|
BasicAclEntryAfterInvocationProvider provider = new BasicAclEntryAfterInvocationProvider();
|
||||||
|
provider.setAclManager(aclManager);
|
||||||
|
provider.afterPropertiesSet();
|
||||||
|
|
||||||
|
// Create the Authentication and Config Attribs we'll be presenting
|
||||||
|
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("scott",
|
||||||
|
"NOT_USED");
|
||||||
|
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||||
|
attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_READ"));
|
||||||
|
|
||||||
|
try {
|
||||||
|
provider.decide(auth, new MockMethodInvocation(), attr, "belmont");
|
||||||
|
fail("Should have thrown AccessDeniedException");
|
||||||
|
} catch (AccessDeniedException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCorrectOperationWhenPrincipalIsAuthorised()
|
||||||
|
throws Exception {
|
||||||
|
// Create an AclManager
|
||||||
|
AclManager aclManager = new MockAclManager("belmont", "marissa",
|
||||||
|
new AclEntry[] {new MockAclEntry(), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.READ), new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)});
|
||||||
|
|
||||||
|
BasicAclEntryAfterInvocationProvider provider = new BasicAclEntryAfterInvocationProvider();
|
||||||
|
provider.setAclManager(aclManager);
|
||||||
|
assertEquals(aclManager, provider.getAclManager());
|
||||||
|
provider.afterPropertiesSet();
|
||||||
|
|
||||||
|
// Create the Authentication and Config Attribs we'll be presenting
|
||||||
|
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("marissa",
|
||||||
|
"NOT_USED");
|
||||||
|
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||||
|
attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_READ"));
|
||||||
|
|
||||||
|
// Filter
|
||||||
|
assertEquals("belmont",
|
||||||
|
provider.decide(auth, new MockMethodInvocation(), attr, "belmont"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testGrantsAccessIfReturnedObjectIsNull()
|
||||||
|
throws Exception {
|
||||||
|
// Create an AclManager
|
||||||
|
AclManager aclManager = new MockAclManager("belmont", "marissa",
|
||||||
|
new AclEntry[] {new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.READ), new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE), new MockAclEntry()});
|
||||||
|
|
||||||
|
BasicAclEntryAfterInvocationProvider provider = new BasicAclEntryAfterInvocationProvider();
|
||||||
|
provider.setAclManager(aclManager);
|
||||||
|
provider.afterPropertiesSet();
|
||||||
|
|
||||||
|
// Create the Authentication and Config Attribs we'll be presenting
|
||||||
|
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("marissa",
|
||||||
|
"NOT_USED");
|
||||||
|
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||||
|
attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_READ"));
|
||||||
|
|
||||||
|
// Filter
|
||||||
|
assertNull(provider.decide(auth, new MockMethodInvocation(), attr, null));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testRespectsModificationsToProcessConfigAttribute()
|
||||||
|
throws Exception {
|
||||||
|
// Create an AclManager
|
||||||
|
AclManager aclManager = new MockAclManager("sydney", "marissa",
|
||||||
|
new AclEntry[] {new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null, SimpleAclEntry.READ), new MockAclEntry()});
|
||||||
|
|
||||||
|
BasicAclEntryAfterInvocationProvider provider = new BasicAclEntryAfterInvocationProvider();
|
||||||
|
provider.setAclManager(aclManager);
|
||||||
|
assertEquals("AFTER_ACL_READ", provider.getProcessConfigAttribute());
|
||||||
|
provider.setProcessConfigAttribute("AFTER_ACL_ADMIN");
|
||||||
|
assertEquals("AFTER_ACL_ADMIN", provider.getProcessConfigAttribute());
|
||||||
|
provider.afterPropertiesSet();
|
||||||
|
|
||||||
|
// Create the Authentication and Config Attribs we'll be presenting
|
||||||
|
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("marissa",
|
||||||
|
"NOT_USED");
|
||||||
|
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||||
|
attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_READ"));
|
||||||
|
|
||||||
|
// As no matching config attrib, ensure provider returns original obj
|
||||||
|
assertEquals("sydney",
|
||||||
|
provider.decide(auth, new MockMethodInvocation(), attr, "sydney"));
|
||||||
|
|
||||||
|
// Filter, this time with the conf attrib provider setup to answer
|
||||||
|
attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_ADMIN"));
|
||||||
|
assertEquals("sydney",
|
||||||
|
provider.decide(auth, new MockMethodInvocation(), attr, "sydney"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testRespectsModificationsToRequirePermissions()
|
||||||
|
throws Exception {
|
||||||
|
// Create an AclManager
|
||||||
|
AclManager aclManager = new MockAclManager("sydney", "marissa",
|
||||||
|
new AclEntry[] {new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION), new MockAclEntry()});
|
||||||
|
|
||||||
|
BasicAclEntryAfterInvocationProvider provider = new BasicAclEntryAfterInvocationProvider();
|
||||||
|
provider.setAclManager(aclManager);
|
||||||
|
assertEquals(SimpleAclEntry.READ, provider.getRequirePermission()[0]);
|
||||||
|
provider.setRequirePermission(new int[] {SimpleAclEntry.ADMINISTRATION});
|
||||||
|
assertEquals(SimpleAclEntry.ADMINISTRATION,
|
||||||
|
provider.getRequirePermission()[0]);
|
||||||
|
provider.afterPropertiesSet();
|
||||||
|
|
||||||
|
// Create the Authentication and Config Attribs we'll be presenting
|
||||||
|
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("marissa",
|
||||||
|
"NOT_USED");
|
||||||
|
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||||
|
attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_READ"));
|
||||||
|
|
||||||
|
// Filter
|
||||||
|
assertEquals("sydney",
|
||||||
|
provider.decide(auth, new MockMethodInvocation(), attr, "sydney"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testStartupDetectsMissingAclManager() throws Exception {
|
||||||
|
BasicAclEntryAfterInvocationProvider provider = new BasicAclEntryAfterInvocationProvider();
|
||||||
|
|
||||||
|
try {
|
||||||
|
provider.afterPropertiesSet();
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertEquals("An aclManager is mandatory", expected.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testStartupDetectsMissingProcessConfigAttribute()
|
||||||
|
throws Exception {
|
||||||
|
BasicAclEntryAfterInvocationProvider provider = new BasicAclEntryAfterInvocationProvider();
|
||||||
|
AclManager aclManager = new MockAclManager("sydney", "marissa",
|
||||||
|
new AclEntry[] {new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION), new MockAclEntry()});
|
||||||
|
provider.setAclManager(aclManager);
|
||||||
|
|
||||||
|
provider.setProcessConfigAttribute(null);
|
||||||
|
|
||||||
|
try {
|
||||||
|
provider.afterPropertiesSet();
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertEquals("A processConfigAttribute is mandatory",
|
||||||
|
expected.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testStartupDetectsMissingRequirePermission()
|
||||||
|
throws Exception {
|
||||||
|
BasicAclEntryAfterInvocationProvider provider = new BasicAclEntryAfterInvocationProvider();
|
||||||
|
AclManager aclManager = new MockAclManager("sydney", "marissa",
|
||||||
|
new AclEntry[] {new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION), new MockAclEntry()});
|
||||||
|
provider.setAclManager(aclManager);
|
||||||
|
|
||||||
|
provider.setRequirePermission(null);
|
||||||
|
|
||||||
|
try {
|
||||||
|
provider.afterPropertiesSet();
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertEquals("One or more requirePermission entries is mandatory",
|
||||||
|
expected.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testSupportsAnything() {
|
||||||
|
assertTrue(new BasicAclEntryAfterInvocationProvider().supports(
|
||||||
|
String.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Inner Classes ==========================================================
|
||||||
|
|
||||||
|
private class MockAclEntry implements AclEntry {
|
||||||
|
// just so AclTag iterates some different types of AclEntrys
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,125 @@
|
||||||
|
/* 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.intercept;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import net.sf.acegisecurity.MockAccessDecisionManager;
|
||||||
|
import net.sf.acegisecurity.MockAfterInvocationManager;
|
||||||
|
import net.sf.acegisecurity.MockAuthenticationManager;
|
||||||
|
import net.sf.acegisecurity.MockMethodInvocation;
|
||||||
|
import net.sf.acegisecurity.MockRunAsManager;
|
||||||
|
import net.sf.acegisecurity.intercept.method.MockMethodDefinitionSource;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests some {@link AbstractSecurityInterceptor} methods. Most of the testing
|
||||||
|
* for this class is found in the <code>MethodSecurityInterceptorTests</code>
|
||||||
|
* class.
|
||||||
|
*
|
||||||
|
* @author Ben Alex
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class AbstractSecurityInterceptorTests extends TestCase {
|
||||||
|
//~ Constructors ===========================================================
|
||||||
|
|
||||||
|
public AbstractSecurityInterceptorTests() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public AbstractSecurityInterceptorTests(String arg0) {
|
||||||
|
super(arg0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
junit.textui.TestRunner.run(AbstractSecurityInterceptorTests.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testDetectsIfInvocationPassedIncompatibleSecureObject()
|
||||||
|
throws Exception {
|
||||||
|
MockSecurityInterceptorWhichOnlySupportsStrings si = new MockSecurityInterceptorWhichOnlySupportsStrings();
|
||||||
|
si.setRunAsManager(new MockRunAsManager());
|
||||||
|
si.setAuthenticationManager(new MockAuthenticationManager());
|
||||||
|
si.setAfterInvocationManager(new MockAfterInvocationManager());
|
||||||
|
si.setAccessDecisionManager(new MockAccessDecisionManager());
|
||||||
|
si.setObjectDefinitionSource(new MockMethodDefinitionSource(false, true));
|
||||||
|
|
||||||
|
try {
|
||||||
|
si.beforeInvocation(new MockMethodInvocation());
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(expected.getMessage().startsWith("Security invocation attempted for object"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testDetectsViolationOfGetSecureObjectClassMethod()
|
||||||
|
throws Exception {
|
||||||
|
MockSecurityInterceptorReturnsNull si = new MockSecurityInterceptorReturnsNull();
|
||||||
|
si.setRunAsManager(new MockRunAsManager());
|
||||||
|
si.setAuthenticationManager(new MockAuthenticationManager());
|
||||||
|
si.setAfterInvocationManager(new MockAfterInvocationManager());
|
||||||
|
si.setAccessDecisionManager(new MockAccessDecisionManager());
|
||||||
|
si.setObjectDefinitionSource(new MockMethodDefinitionSource(false, true));
|
||||||
|
|
||||||
|
try {
|
||||||
|
si.afterPropertiesSet();
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertEquals("Subclass must provide a non-null response to getSecureObjectClass()",
|
||||||
|
expected.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Inner Classes ==========================================================
|
||||||
|
|
||||||
|
private class MockSecurityInterceptorReturnsNull
|
||||||
|
extends AbstractSecurityInterceptor {
|
||||||
|
private ObjectDefinitionSource objectDefinitionSource;
|
||||||
|
|
||||||
|
public void setObjectDefinitionSource(
|
||||||
|
ObjectDefinitionSource objectDefinitionSource) {
|
||||||
|
this.objectDefinitionSource = objectDefinitionSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class getSecureObjectClass() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ObjectDefinitionSource obtainObjectDefinitionSource() {
|
||||||
|
return objectDefinitionSource;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class MockSecurityInterceptorWhichOnlySupportsStrings
|
||||||
|
extends AbstractSecurityInterceptor {
|
||||||
|
private ObjectDefinitionSource objectDefinitionSource;
|
||||||
|
|
||||||
|
public void setObjectDefinitionSource(
|
||||||
|
ObjectDefinitionSource objectDefinitionSource) {
|
||||||
|
this.objectDefinitionSource = objectDefinitionSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class getSecureObjectClass() {
|
||||||
|
return String.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ObjectDefinitionSource obtainObjectDefinitionSource() {
|
||||||
|
return objectDefinitionSource;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,74 @@
|
||||||
|
/* 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.intercept;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import net.sf.acegisecurity.ConfigAttributeDefinition;
|
||||||
|
import net.sf.acegisecurity.MockMethodInvocation;
|
||||||
|
import net.sf.acegisecurity.SecurityConfig;
|
||||||
|
import net.sf.acegisecurity.providers.UsernamePasswordAuthenticationToken;
|
||||||
|
|
||||||
|
import org.aopalliance.intercept.MethodInvocation;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests {@link InterceptorStatusToken}.
|
||||||
|
*
|
||||||
|
* @author Ben Alex
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class InterceptorStatusTokenTests extends TestCase {
|
||||||
|
//~ Constructors ===========================================================
|
||||||
|
|
||||||
|
public InterceptorStatusTokenTests() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public InterceptorStatusTokenTests(String arg0) {
|
||||||
|
super(arg0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
junit.textui.TestRunner.run(InterceptorStatusTokenTests.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testDefaultConstructor() {
|
||||||
|
try {
|
||||||
|
new InterceptorStatusToken();
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testOperation() {
|
||||||
|
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||||
|
attr.addConfigAttribute(new SecurityConfig("FOO"));
|
||||||
|
|
||||||
|
MethodInvocation mi = new MockMethodInvocation();
|
||||||
|
|
||||||
|
InterceptorStatusToken token = new InterceptorStatusToken(new UsernamePasswordAuthenticationToken(
|
||||||
|
"marissa", "koala"), true, attr, mi);
|
||||||
|
|
||||||
|
assertTrue(token.isContextHolderRefreshRequired());
|
||||||
|
assertEquals(attr, token.getAttr());
|
||||||
|
assertEquals(mi, token.getSecureObject());
|
||||||
|
assertEquals("marissa", token.getAuthentication().getPrincipal());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,74 @@
|
||||||
|
/* 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.intercept.event;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import net.sf.acegisecurity.AuthenticationCredentialsNotFoundException;
|
||||||
|
import net.sf.acegisecurity.ConfigAttributeDefinition;
|
||||||
|
import net.sf.acegisecurity.MockMethodInvocation;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests {@link AuthenticationCredentialsNotFoundEvent}.
|
||||||
|
*
|
||||||
|
* @author Ben Alex
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class AuthenticationCredentialsNotFoundEventTests extends TestCase {
|
||||||
|
//~ Constructors ===========================================================
|
||||||
|
|
||||||
|
public AuthenticationCredentialsNotFoundEventTests() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public AuthenticationCredentialsNotFoundEventTests(String arg0) {
|
||||||
|
super(arg0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
junit.textui.TestRunner.run(AuthenticationCredentialsNotFoundEventTests.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testRejectsNulls() {
|
||||||
|
try {
|
||||||
|
AuthenticationCredentialsNotFoundEvent event = new AuthenticationCredentialsNotFoundEvent(null,
|
||||||
|
new ConfigAttributeDefinition(),
|
||||||
|
new AuthenticationCredentialsNotFoundException("test"));
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
AuthenticationCredentialsNotFoundEvent event = new AuthenticationCredentialsNotFoundEvent(new MockMethodInvocation(),
|
||||||
|
null, new AuthenticationCredentialsNotFoundException("test"));
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
AuthenticationCredentialsNotFoundEvent event = new AuthenticationCredentialsNotFoundEvent(new MockMethodInvocation(),
|
||||||
|
new ConfigAttributeDefinition(), null);
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,88 @@
|
||||||
|
/* 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.intercept.event;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import net.sf.acegisecurity.BadCredentialsException;
|
||||||
|
import net.sf.acegisecurity.ConfigAttributeDefinition;
|
||||||
|
import net.sf.acegisecurity.MockMethodInvocation;
|
||||||
|
import net.sf.acegisecurity.providers.UsernamePasswordAuthenticationToken;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests {@link AuthenticationFailureEvent}.
|
||||||
|
*
|
||||||
|
* @author Ben Alex
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class AuthenticationFailureEventTests extends TestCase {
|
||||||
|
//~ Constructors ===========================================================
|
||||||
|
|
||||||
|
public AuthenticationFailureEventTests() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public AuthenticationFailureEventTests(String arg0) {
|
||||||
|
super(arg0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
junit.textui.TestRunner.run(AuthenticationFailureEventTests.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testRejectsNulls() {
|
||||||
|
try {
|
||||||
|
AuthenticationFailureEvent event = new AuthenticationFailureEvent(null,
|
||||||
|
new ConfigAttributeDefinition(),
|
||||||
|
new UsernamePasswordAuthenticationToken("foo", "bar"),
|
||||||
|
new BadCredentialsException("error"));
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
AuthenticationFailureEvent event = new AuthenticationFailureEvent(new MockMethodInvocation(),
|
||||||
|
null,
|
||||||
|
new UsernamePasswordAuthenticationToken("foo", "bar"),
|
||||||
|
new BadCredentialsException("error"));
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
AuthenticationFailureEvent event = new AuthenticationFailureEvent(new MockMethodInvocation(),
|
||||||
|
new ConfigAttributeDefinition(), null,
|
||||||
|
new BadCredentialsException("error"));
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
AuthenticationFailureEvent event = new AuthenticationFailureEvent(new MockMethodInvocation(),
|
||||||
|
new ConfigAttributeDefinition(),
|
||||||
|
new UsernamePasswordAuthenticationToken("foo", "bar"), null);
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,88 @@
|
||||||
|
/* 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.intercept.event;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import net.sf.acegisecurity.AccessDeniedException;
|
||||||
|
import net.sf.acegisecurity.ConfigAttributeDefinition;
|
||||||
|
import net.sf.acegisecurity.MockMethodInvocation;
|
||||||
|
import net.sf.acegisecurity.providers.UsernamePasswordAuthenticationToken;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests {@link AuthorizationFailureEvent}.
|
||||||
|
*
|
||||||
|
* @author Ben Alex
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class AuthorizationFailureEventTests extends TestCase {
|
||||||
|
//~ Constructors ===========================================================
|
||||||
|
|
||||||
|
public AuthorizationFailureEventTests() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public AuthorizationFailureEventTests(String arg0) {
|
||||||
|
super(arg0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
junit.textui.TestRunner.run(AuthorizationFailureEventTests.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testRejectsNulls() {
|
||||||
|
try {
|
||||||
|
AuthorizationFailureEvent event = new AuthorizationFailureEvent(null,
|
||||||
|
new ConfigAttributeDefinition(),
|
||||||
|
new UsernamePasswordAuthenticationToken("foo", "bar"),
|
||||||
|
new AccessDeniedException("error"));
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
AuthorizationFailureEvent event = new AuthorizationFailureEvent(new MockMethodInvocation(),
|
||||||
|
null,
|
||||||
|
new UsernamePasswordAuthenticationToken("foo", "bar"),
|
||||||
|
new AccessDeniedException("error"));
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
AuthorizationFailureEvent event = new AuthorizationFailureEvent(new MockMethodInvocation(),
|
||||||
|
new ConfigAttributeDefinition(), null,
|
||||||
|
new AccessDeniedException("error"));
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
AuthorizationFailureEvent event = new AuthorizationFailureEvent(new MockMethodInvocation(),
|
||||||
|
new ConfigAttributeDefinition(),
|
||||||
|
new UsernamePasswordAuthenticationToken("foo", "bar"), null);
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,74 @@
|
||||||
|
/* 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.intercept.event;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import net.sf.acegisecurity.ConfigAttributeDefinition;
|
||||||
|
import net.sf.acegisecurity.MockMethodInvocation;
|
||||||
|
import net.sf.acegisecurity.providers.UsernamePasswordAuthenticationToken;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests {@link AuthorizedEvent}.
|
||||||
|
*
|
||||||
|
* @author Ben Alex
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class AuthorizedEventTests extends TestCase {
|
||||||
|
//~ Constructors ===========================================================
|
||||||
|
|
||||||
|
public AuthorizedEventTests() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public AuthorizedEventTests(String arg0) {
|
||||||
|
super(arg0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
junit.textui.TestRunner.run(AuthorizedEventTests.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testRejectsNulls() {
|
||||||
|
try {
|
||||||
|
AuthorizedEvent event = new AuthorizedEvent(null,
|
||||||
|
new ConfigAttributeDefinition(),
|
||||||
|
new UsernamePasswordAuthenticationToken("foo", "bar"));
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
AuthorizedEvent event = new AuthorizedEvent(new MockMethodInvocation(),
|
||||||
|
null, new UsernamePasswordAuthenticationToken("foo", "bar"));
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
AuthorizedEvent event = new AuthorizedEvent(new MockMethodInvocation(),
|
||||||
|
new ConfigAttributeDefinition(), null);
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -32,16 +32,13 @@ import net.sf.acegisecurity.context.SecureContext;
|
||||||
import net.sf.acegisecurity.context.SecureContextImpl;
|
import net.sf.acegisecurity.context.SecureContextImpl;
|
||||||
import net.sf.acegisecurity.providers.UsernamePasswordAuthenticationToken;
|
import net.sf.acegisecurity.providers.UsernamePasswordAuthenticationToken;
|
||||||
|
|
||||||
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
|
import org.springframework.context.ApplicationContext;
|
||||||
import org.springframework.beans.factory.support.PropertiesBeanDefinitionReader;
|
|
||||||
|
|
||||||
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Properties;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
|
||||||
|
@ -228,47 +225,10 @@ public class MethodDefinitionAttributesTests extends TestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
private ITargetObject makeInterceptedTarget() {
|
private ITargetObject makeInterceptedTarget() {
|
||||||
String PREFIX = "beans.";
|
ApplicationContext context = new ClassPathXmlApplicationContext(
|
||||||
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
|
"net/sf/acegisecurity/intercept/method/applicationContext.xml");
|
||||||
Properties p = new Properties();
|
|
||||||
p.setProperty(PREFIX + "authentication.class",
|
|
||||||
"net.sf.acegisecurity.MockAuthenticationManager");
|
|
||||||
p.setProperty(PREFIX + "accessDecision.class",
|
|
||||||
"net.sf.acegisecurity.MockAccessDecisionManager");
|
|
||||||
p.setProperty(PREFIX + "runAs.class",
|
|
||||||
"net.sf.acegisecurity.MockRunAsManager");
|
|
||||||
p.setProperty(PREFIX + "attributes.class",
|
|
||||||
"net.sf.acegisecurity.intercept.method.MockAttributes");
|
|
||||||
|
|
||||||
p.setProperty(PREFIX + "objectDefinitionSource.class",
|
return (ITargetObject) context.getBean("target");
|
||||||
"net.sf.acegisecurity.intercept.method.MethodDefinitionAttributes");
|
|
||||||
p.setProperty(PREFIX + "objectDefinitionSource.attributes(ref)",
|
|
||||||
"attributes");
|
|
||||||
|
|
||||||
p.setProperty(PREFIX + "securityInterceptor.class",
|
|
||||||
"net.sf.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor");
|
|
||||||
p.setProperty(PREFIX + "securityInterceptor.authenticationManager(ref)",
|
|
||||||
"authentication");
|
|
||||||
p.setProperty(PREFIX + "securityInterceptor.accessDecisionManager(ref)",
|
|
||||||
"accessDecision");
|
|
||||||
p.setProperty(PREFIX + "securityInterceptor.runAsManager(ref)", "runAs");
|
|
||||||
p.setProperty(PREFIX
|
|
||||||
+ "securityInterceptor.objectDefinitionSource(ref)",
|
|
||||||
"objectDefinitionSource");
|
|
||||||
|
|
||||||
p.setProperty(PREFIX + "targetObject.class",
|
|
||||||
"net.sf.acegisecurity.TargetObject");
|
|
||||||
p.setProperty(PREFIX + "target.class",
|
|
||||||
"org.springframework.aop.framework.ProxyFactoryBean");
|
|
||||||
p.setProperty(PREFIX + "target.proxyInterfaces",
|
|
||||||
"net.sf.acegisecurity.ITargetObject");
|
|
||||||
p.setProperty(PREFIX + "target.interceptorNames",
|
|
||||||
"securityInterceptor,targetObject");
|
|
||||||
|
|
||||||
(new PropertiesBeanDefinitionReader(lbf)).registerBeanDefinitions(p,
|
|
||||||
PREFIX);
|
|
||||||
|
|
||||||
return (ITargetObject) lbf.getBean("target");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -18,6 +18,7 @@ package net.sf.acegisecurity.intercept.method;
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
import net.sf.acegisecurity.ConfigAttributeDefinition;
|
import net.sf.acegisecurity.ConfigAttributeDefinition;
|
||||||
|
import net.sf.acegisecurity.MockJoinPoint;
|
||||||
import net.sf.acegisecurity.SecurityConfig;
|
import net.sf.acegisecurity.SecurityConfig;
|
||||||
import net.sf.acegisecurity.TargetObject;
|
import net.sf.acegisecurity.TargetObject;
|
||||||
|
|
||||||
|
@ -57,6 +58,28 @@ public class MethodDefinitionSourceEditorTests extends TestCase {
|
||||||
junit.textui.TestRunner.run(MethodDefinitionSourceEditorTests.class);
|
junit.textui.TestRunner.run(MethodDefinitionSourceEditorTests.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testAspectJJointPointLookup() throws Exception {
|
||||||
|
MethodDefinitionSourceEditor editor = new MethodDefinitionSourceEditor();
|
||||||
|
editor.setAsText(
|
||||||
|
"net.sf.acegisecurity.TargetObject.countLength=ROLE_ONE,ROLE_TWO,RUN_AS_ENTRY");
|
||||||
|
|
||||||
|
MethodDefinitionMap map = (MethodDefinitionMap) editor.getValue();
|
||||||
|
|
||||||
|
Class clazz = TargetObject.class;
|
||||||
|
Method method = clazz.getMethod("countLength",
|
||||||
|
new Class[] {String.class});
|
||||||
|
MockJoinPoint joinPoint = new MockJoinPoint(new TargetObject(), method);
|
||||||
|
|
||||||
|
ConfigAttributeDefinition returnedCountLength = map.getAttributes(joinPoint);
|
||||||
|
|
||||||
|
ConfigAttributeDefinition expectedCountLength = new ConfigAttributeDefinition();
|
||||||
|
expectedCountLength.addConfigAttribute(new SecurityConfig("ROLE_ONE"));
|
||||||
|
expectedCountLength.addConfigAttribute(new SecurityConfig("ROLE_TWO"));
|
||||||
|
expectedCountLength.addConfigAttribute(new SecurityConfig(
|
||||||
|
"RUN_AS_ENTRY"));
|
||||||
|
assertEquals(expectedCountLength, returnedCountLength);
|
||||||
|
}
|
||||||
|
|
||||||
public void testClassNameNotFoundResultsInException() {
|
public void testClassNameNotFoundResultsInException() {
|
||||||
MethodDefinitionSourceEditor editor = new MethodDefinitionSourceEditor();
|
MethodDefinitionSourceEditor editor = new MethodDefinitionSourceEditor();
|
||||||
|
|
||||||
|
@ -160,7 +183,7 @@ public class MethodDefinitionSourceEditorTests extends TestCase {
|
||||||
"net.sf.acegisecurity.TargetObject.*=ROLE_GENERAL\r\nnet.sf.acegisecurity.TargetObject.makeLower*=ROLE_LOWER\r\nnet.sf.acegisecurity.TargetObject.make*=ROLE_MAKE\r\nnet.sf.acegisecurity.TargetObject.makeUpper*=ROLE_UPPER");
|
"net.sf.acegisecurity.TargetObject.*=ROLE_GENERAL\r\nnet.sf.acegisecurity.TargetObject.makeLower*=ROLE_LOWER\r\nnet.sf.acegisecurity.TargetObject.make*=ROLE_MAKE\r\nnet.sf.acegisecurity.TargetObject.makeUpper*=ROLE_UPPER");
|
||||||
|
|
||||||
MethodDefinitionMap map = (MethodDefinitionMap) editor.getValue();
|
MethodDefinitionMap map = (MethodDefinitionMap) editor.getValue();
|
||||||
assertEquals(4, map.getMethodMapSize());
|
assertEquals(5, map.getMethodMapSize());
|
||||||
|
|
||||||
ConfigAttributeDefinition returnedMakeLower = map.getAttributes(new MockMethodInvocation(
|
ConfigAttributeDefinition returnedMakeLower = map.getAttributes(new MockMethodInvocation(
|
||||||
TargetObject.class, "makeLowerCase",
|
TargetObject.class, "makeLowerCase",
|
||||||
|
|
|
@ -85,6 +85,49 @@ public class MethodDefinitionSourceAdvisorTests extends TestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testUnsupportedOperations() throws Throwable {
|
||||||
|
Class clazz = TargetObject.class;
|
||||||
|
Method method = clazz.getMethod("countLength",
|
||||||
|
new Class[] {String.class});
|
||||||
|
|
||||||
|
MethodDefinitionSourceAdvisor.InternalMethodInvocation imi = new MethodDefinitionSourceAdvisor(getInterceptor()).new InternalMethodInvocation(method);
|
||||||
|
|
||||||
|
try {
|
||||||
|
imi.getArguments();
|
||||||
|
fail("Should have thrown UnsupportedOperationException");
|
||||||
|
} catch (UnsupportedOperationException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
imi.getStaticPart();
|
||||||
|
fail("Should have thrown UnsupportedOperationException");
|
||||||
|
} catch (UnsupportedOperationException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
imi.getThis();
|
||||||
|
fail("Should have thrown UnsupportedOperationException");
|
||||||
|
} catch (UnsupportedOperationException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
imi.proceed();
|
||||||
|
fail("Should have thrown UnsupportedOperationException");
|
||||||
|
} catch (UnsupportedOperationException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
new MethodDefinitionSourceAdvisor(getInterceptor()).new InternalMethodInvocation();
|
||||||
|
fail("Should have thrown UnsupportedOperationException");
|
||||||
|
} catch (UnsupportedOperationException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private MethodSecurityInterceptor getInterceptor() {
|
private MethodSecurityInterceptor getInterceptor() {
|
||||||
MethodDefinitionSourceEditor editor = new MethodDefinitionSourceEditor();
|
MethodDefinitionSourceEditor editor = new MethodDefinitionSourceEditor();
|
||||||
editor.setAsText(
|
editor.setAsText(
|
||||||
|
|
|
@ -19,14 +19,17 @@ import junit.framework.TestCase;
|
||||||
|
|
||||||
import net.sf.acegisecurity.AccessDecisionManager;
|
import net.sf.acegisecurity.AccessDecisionManager;
|
||||||
import net.sf.acegisecurity.AccessDeniedException;
|
import net.sf.acegisecurity.AccessDeniedException;
|
||||||
|
import net.sf.acegisecurity.AfterInvocationManager;
|
||||||
import net.sf.acegisecurity.Authentication;
|
import net.sf.acegisecurity.Authentication;
|
||||||
import net.sf.acegisecurity.AuthenticationCredentialsNotFoundException;
|
import net.sf.acegisecurity.AuthenticationCredentialsNotFoundException;
|
||||||
|
import net.sf.acegisecurity.AuthenticationException;
|
||||||
import net.sf.acegisecurity.ConfigAttribute;
|
import net.sf.acegisecurity.ConfigAttribute;
|
||||||
import net.sf.acegisecurity.ConfigAttributeDefinition;
|
import net.sf.acegisecurity.ConfigAttributeDefinition;
|
||||||
import net.sf.acegisecurity.GrantedAuthority;
|
import net.sf.acegisecurity.GrantedAuthority;
|
||||||
import net.sf.acegisecurity.GrantedAuthorityImpl;
|
import net.sf.acegisecurity.GrantedAuthorityImpl;
|
||||||
import net.sf.acegisecurity.ITargetObject;
|
import net.sf.acegisecurity.ITargetObject;
|
||||||
import net.sf.acegisecurity.MockAccessDecisionManager;
|
import net.sf.acegisecurity.MockAccessDecisionManager;
|
||||||
|
import net.sf.acegisecurity.MockAfterInvocationManager;
|
||||||
import net.sf.acegisecurity.MockAuthenticationManager;
|
import net.sf.acegisecurity.MockAuthenticationManager;
|
||||||
import net.sf.acegisecurity.MockRunAsManager;
|
import net.sf.acegisecurity.MockRunAsManager;
|
||||||
import net.sf.acegisecurity.RunAsManager;
|
import net.sf.acegisecurity.RunAsManager;
|
||||||
|
@ -139,17 +142,20 @@ public class MethodSecurityInterceptorTests extends TestCase {
|
||||||
MockAuthenticationManager authManager = new MockAuthenticationManager();
|
MockAuthenticationManager authManager = new MockAuthenticationManager();
|
||||||
MockMethodDefinitionSource methodSource = new MockMethodDefinitionSource(false,
|
MockMethodDefinitionSource methodSource = new MockMethodDefinitionSource(false,
|
||||||
true);
|
true);
|
||||||
|
MockAfterInvocationManager afterInvocation = new MockAfterInvocationManager();
|
||||||
|
|
||||||
MethodSecurityInterceptor si = new MethodSecurityInterceptor();
|
MethodSecurityInterceptor si = new MethodSecurityInterceptor();
|
||||||
si.setAccessDecisionManager(accessDecision);
|
si.setAccessDecisionManager(accessDecision);
|
||||||
si.setRunAsManager(runAs);
|
si.setRunAsManager(runAs);
|
||||||
si.setAuthenticationManager(authManager);
|
si.setAuthenticationManager(authManager);
|
||||||
si.setObjectDefinitionSource(methodSource);
|
si.setObjectDefinitionSource(methodSource);
|
||||||
|
si.setAfterInvocationManager(afterInvocation);
|
||||||
|
|
||||||
assertEquals(accessDecision, si.getAccessDecisionManager());
|
assertEquals(accessDecision, si.getAccessDecisionManager());
|
||||||
assertEquals(runAs, si.getRunAsManager());
|
assertEquals(runAs, si.getRunAsManager());
|
||||||
assertEquals(authManager, si.getAuthenticationManager());
|
assertEquals(authManager, si.getAuthenticationManager());
|
||||||
assertEquals(methodSource, si.getObjectDefinitionSource());
|
assertEquals(methodSource, si.getObjectDefinitionSource());
|
||||||
|
assertEquals(afterInvocation, si.getAfterInvocationManager());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testMethodCallWithRunAsReplacement() throws Exception {
|
public void testMethodCallWithRunAsReplacement() throws Exception {
|
||||||
|
@ -178,7 +184,7 @@ public class MethodSecurityInterceptorTests extends TestCase {
|
||||||
context.setAuthentication(token);
|
context.setAuthentication(token);
|
||||||
ContextHolder.setContext(context);
|
ContextHolder.setContext(context);
|
||||||
|
|
||||||
ITargetObject target = makeInterceptedTarget();
|
ITargetObject target = makeInterceptedTargetWithoutAnAfterInvocationManager();
|
||||||
String result = target.makeLowerCase("HELLO");
|
String result = target.makeLowerCase("HELLO");
|
||||||
|
|
||||||
// Note we check the isAuthenticated becomes true in following line
|
// Note we check the isAuthenticated becomes true in following line
|
||||||
|
@ -234,7 +240,8 @@ public class MethodSecurityInterceptorTests extends TestCase {
|
||||||
ContextHolder.setContext(null);
|
ContextHolder.setContext(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testRejectsAccessDecisionManagersThatDoNotSupportMethodInvocation() {
|
public void testRejectsAccessDecisionManagersThatDoNotSupportMethodInvocation()
|
||||||
|
throws Exception {
|
||||||
MethodSecurityInterceptor si = new MethodSecurityInterceptor();
|
MethodSecurityInterceptor si = new MethodSecurityInterceptor();
|
||||||
si.setAccessDecisionManager(new MockAccessDecisionManagerWhichOnlySupportsStrings());
|
si.setAccessDecisionManager(new MockAccessDecisionManagerWhichOnlySupportsStrings());
|
||||||
si.setAuthenticationManager(new MockAuthenticationManager());
|
si.setAuthenticationManager(new MockAuthenticationManager());
|
||||||
|
@ -250,6 +257,28 @@ public class MethodSecurityInterceptorTests extends TestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testRejectsCallsWhenAuthenticationIsIncorrect()
|
||||||
|
throws Exception {
|
||||||
|
SecureContext context = new SecureContextImpl();
|
||||||
|
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken("Test",
|
||||||
|
"Password",
|
||||||
|
new GrantedAuthority[] {new GrantedAuthorityImpl("MOCK_LOWER")});
|
||||||
|
assertTrue(!token.isAuthenticated());
|
||||||
|
context.setAuthentication(token);
|
||||||
|
ContextHolder.setContext(context);
|
||||||
|
|
||||||
|
ITargetObject target = makeInterceptedTargetRejectsAuthentication();
|
||||||
|
|
||||||
|
try {
|
||||||
|
target.makeLowerCase("HELLO");
|
||||||
|
fail("Should have thrown AuthenticationException");
|
||||||
|
} catch (AuthenticationException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
ContextHolder.setContext(null);
|
||||||
|
}
|
||||||
|
|
||||||
public void testRejectsCallsWhenObjectDefinitionSourceDoesNotSupportObject()
|
public void testRejectsCallsWhenObjectDefinitionSourceDoesNotSupportObject()
|
||||||
throws Throwable {
|
throws Throwable {
|
||||||
MethodSecurityInterceptor interceptor = new MethodSecurityInterceptor();
|
MethodSecurityInterceptor interceptor = new MethodSecurityInterceptor();
|
||||||
|
@ -278,12 +307,14 @@ public class MethodSecurityInterceptorTests extends TestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testRejectsRunAsManagersThatDoNotSupportMethodInvocation() {
|
public void testRejectsRunAsManagersThatDoNotSupportMethodInvocation()
|
||||||
|
throws Exception {
|
||||||
MethodSecurityInterceptor si = new MethodSecurityInterceptor();
|
MethodSecurityInterceptor si = new MethodSecurityInterceptor();
|
||||||
si.setAccessDecisionManager(new MockAccessDecisionManager());
|
si.setAccessDecisionManager(new MockAccessDecisionManager());
|
||||||
si.setAuthenticationManager(new MockAuthenticationManager());
|
si.setAuthenticationManager(new MockAuthenticationManager());
|
||||||
si.setObjectDefinitionSource(new MockMethodDefinitionSource(false, true));
|
si.setObjectDefinitionSource(new MockMethodDefinitionSource(false, true));
|
||||||
si.setRunAsManager(new MockRunAsManagerWhichOnlySupportsStrings());
|
si.setRunAsManager(new MockRunAsManagerWhichOnlySupportsStrings());
|
||||||
|
si.setAfterInvocationManager(new MockAfterInvocationManager());
|
||||||
|
|
||||||
try {
|
try {
|
||||||
si.afterPropertiesSet();
|
si.afterPropertiesSet();
|
||||||
|
@ -294,10 +325,12 @@ public class MethodSecurityInterceptorTests extends TestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testStartupCheckForAccessDecisionManager() {
|
public void testStartupCheckForAccessDecisionManager()
|
||||||
|
throws Exception {
|
||||||
MethodSecurityInterceptor si = new MethodSecurityInterceptor();
|
MethodSecurityInterceptor si = new MethodSecurityInterceptor();
|
||||||
si.setRunAsManager(new MockRunAsManager());
|
si.setRunAsManager(new MockRunAsManager());
|
||||||
si.setAuthenticationManager(new MockAuthenticationManager());
|
si.setAuthenticationManager(new MockAuthenticationManager());
|
||||||
|
si.setAfterInvocationManager(new MockAfterInvocationManager());
|
||||||
|
|
||||||
si.setObjectDefinitionSource(new MockMethodDefinitionSource(false, true));
|
si.setObjectDefinitionSource(new MockMethodDefinitionSource(false, true));
|
||||||
|
|
||||||
|
@ -310,10 +343,12 @@ public class MethodSecurityInterceptorTests extends TestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testStartupCheckForAuthenticationManager() {
|
public void testStartupCheckForAuthenticationManager()
|
||||||
|
throws Exception {
|
||||||
MethodSecurityInterceptor si = new MethodSecurityInterceptor();
|
MethodSecurityInterceptor si = new MethodSecurityInterceptor();
|
||||||
si.setAccessDecisionManager(new MockAccessDecisionManager());
|
si.setAccessDecisionManager(new MockAccessDecisionManager());
|
||||||
si.setRunAsManager(new MockRunAsManager());
|
si.setRunAsManager(new MockRunAsManager());
|
||||||
|
si.setAfterInvocationManager(new MockAfterInvocationManager());
|
||||||
|
|
||||||
si.setObjectDefinitionSource(new MockMethodDefinitionSource(false, true));
|
si.setObjectDefinitionSource(new MockMethodDefinitionSource(false, true));
|
||||||
|
|
||||||
|
@ -326,7 +361,8 @@ public class MethodSecurityInterceptorTests extends TestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testStartupCheckForMethodDefinitionSource() {
|
public void testStartupCheckForMethodDefinitionSource()
|
||||||
|
throws Exception {
|
||||||
MethodSecurityInterceptor si = new MethodSecurityInterceptor();
|
MethodSecurityInterceptor si = new MethodSecurityInterceptor();
|
||||||
si.setAccessDecisionManager(new MockAccessDecisionManager());
|
si.setAccessDecisionManager(new MockAccessDecisionManager());
|
||||||
si.setAuthenticationManager(new MockAuthenticationManager());
|
si.setAuthenticationManager(new MockAuthenticationManager());
|
||||||
|
@ -340,7 +376,7 @@ public class MethodSecurityInterceptorTests extends TestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testStartupCheckForRunAsManager() {
|
public void testStartupCheckForRunAsManager() throws Exception {
|
||||||
MethodSecurityInterceptor si = new MethodSecurityInterceptor();
|
MethodSecurityInterceptor si = new MethodSecurityInterceptor();
|
||||||
si.setAccessDecisionManager(new MockAccessDecisionManager());
|
si.setAccessDecisionManager(new MockAccessDecisionManager());
|
||||||
si.setAuthenticationManager(new MockAuthenticationManager());
|
si.setAuthenticationManager(new MockAuthenticationManager());
|
||||||
|
@ -356,7 +392,25 @@ public class MethodSecurityInterceptorTests extends TestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testValidationFailsIfInvalidAttributePresented() {
|
public void testStartupCheckForValidAfterInvocationManager()
|
||||||
|
throws Exception {
|
||||||
|
MethodSecurityInterceptor si = new MethodSecurityInterceptor();
|
||||||
|
si.setRunAsManager(new MockRunAsManager());
|
||||||
|
si.setAuthenticationManager(new MockAuthenticationManager());
|
||||||
|
si.setAfterInvocationManager(new MockAfterInvocationManagerWhichOnlySupportsStrings());
|
||||||
|
si.setAccessDecisionManager(new MockAccessDecisionManager());
|
||||||
|
si.setObjectDefinitionSource(new MockMethodDefinitionSource(false, true));
|
||||||
|
|
||||||
|
try {
|
||||||
|
si.afterPropertiesSet();
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(expected.getMessage().startsWith("AfterInvocationManager does not support secure object class:"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testValidationFailsIfInvalidAttributePresented()
|
||||||
|
throws Exception {
|
||||||
MethodSecurityInterceptor si = new MethodSecurityInterceptor();
|
MethodSecurityInterceptor si = new MethodSecurityInterceptor();
|
||||||
si.setAccessDecisionManager(new MockAccessDecisionManager());
|
si.setAccessDecisionManager(new MockAccessDecisionManager());
|
||||||
si.setAuthenticationManager(new MockAuthenticationManager());
|
si.setAuthenticationManager(new MockAuthenticationManager());
|
||||||
|
@ -374,7 +428,8 @@ public class MethodSecurityInterceptorTests extends TestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testValidationNotAttemptedIfIsValidateConfigAttributesSetToFalse() {
|
public void testValidationNotAttemptedIfIsValidateConfigAttributesSetToFalse()
|
||||||
|
throws Exception {
|
||||||
MethodSecurityInterceptor si = new MethodSecurityInterceptor();
|
MethodSecurityInterceptor si = new MethodSecurityInterceptor();
|
||||||
si.setAccessDecisionManager(new MockAccessDecisionManager());
|
si.setAccessDecisionManager(new MockAccessDecisionManager());
|
||||||
si.setAuthenticationManager(new MockAuthenticationManager());
|
si.setAuthenticationManager(new MockAuthenticationManager());
|
||||||
|
@ -388,7 +443,8 @@ public class MethodSecurityInterceptorTests extends TestCase {
|
||||||
assertTrue(true);
|
assertTrue(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testValidationNotAttemptedIfMethodDefinitionSourceCannotReturnIterator() {
|
public void testValidationNotAttemptedIfMethodDefinitionSourceCannotReturnIterator()
|
||||||
|
throws Exception {
|
||||||
MethodSecurityInterceptor si = new MethodSecurityInterceptor();
|
MethodSecurityInterceptor si = new MethodSecurityInterceptor();
|
||||||
si.setAccessDecisionManager(new MockAccessDecisionManager());
|
si.setAccessDecisionManager(new MockAccessDecisionManager());
|
||||||
si.setRunAsManager(new MockRunAsManager());
|
si.setRunAsManager(new MockRunAsManager());
|
||||||
|
@ -407,6 +463,29 @@ public class MethodSecurityInterceptorTests extends TestCase {
|
||||||
return (ITargetObject) context.getBean("target");
|
return (ITargetObject) context.getBean("target");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ITargetObject makeInterceptedTargetRejectsAuthentication() {
|
||||||
|
ApplicationContext context = new ClassPathXmlApplicationContext(
|
||||||
|
"net/sf/acegisecurity/intercept/method/aopalliance/applicationContext.xml");
|
||||||
|
|
||||||
|
MockAuthenticationManager authenticationManager = new MockAuthenticationManager(false);
|
||||||
|
MethodSecurityInterceptor si = (MethodSecurityInterceptor) context
|
||||||
|
.getBean("securityInterceptor");
|
||||||
|
si.setAuthenticationManager(authenticationManager);
|
||||||
|
|
||||||
|
return (ITargetObject) context.getBean("target");
|
||||||
|
}
|
||||||
|
|
||||||
|
private ITargetObject makeInterceptedTargetWithoutAnAfterInvocationManager() {
|
||||||
|
ApplicationContext context = new ClassPathXmlApplicationContext(
|
||||||
|
"net/sf/acegisecurity/intercept/method/aopalliance/applicationContext.xml");
|
||||||
|
|
||||||
|
MethodSecurityInterceptor si = (MethodSecurityInterceptor) context
|
||||||
|
.getBean("securityInterceptor");
|
||||||
|
si.setAfterInvocationManager(null);
|
||||||
|
|
||||||
|
return (ITargetObject) context.getBean("target");
|
||||||
|
}
|
||||||
|
|
||||||
//~ Inner Classes ==========================================================
|
//~ Inner Classes ==========================================================
|
||||||
|
|
||||||
private class MockAccessDecisionManagerWhichOnlySupportsStrings
|
private class MockAccessDecisionManagerWhichOnlySupportsStrings
|
||||||
|
@ -430,6 +509,28 @@ public class MethodSecurityInterceptorTests extends TestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class MockAfterInvocationManagerWhichOnlySupportsStrings
|
||||||
|
implements AfterInvocationManager {
|
||||||
|
public Object decide(Authentication authentication, Object object,
|
||||||
|
ConfigAttributeDefinition config, Object returnedObject)
|
||||||
|
throws AccessDeniedException {
|
||||||
|
throw new UnsupportedOperationException(
|
||||||
|
"mock method not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean supports(Class clazz) {
|
||||||
|
if (String.class.isAssignableFrom(clazz)) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean supports(ConfigAttribute attribute) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private class MockObjectDefinitionSourceWhichOnlySupportsStrings
|
private class MockObjectDefinitionSourceWhichOnlySupportsStrings
|
||||||
extends AbstractMethodDefinitionSource {
|
extends AbstractMethodDefinitionSource {
|
||||||
public Iterator getConfigAttributeDefinitions() {
|
public Iterator getConfigAttributeDefinitions() {
|
||||||
|
|
|
@ -0,0 +1,163 @@
|
||||||
|
/* 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.intercept.method.aspectj;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import net.sf.acegisecurity.AccessDeniedException;
|
||||||
|
import net.sf.acegisecurity.GrantedAuthority;
|
||||||
|
import net.sf.acegisecurity.GrantedAuthorityImpl;
|
||||||
|
import net.sf.acegisecurity.MockAccessDecisionManager;
|
||||||
|
import net.sf.acegisecurity.MockApplicationContext;
|
||||||
|
import net.sf.acegisecurity.MockAuthenticationManager;
|
||||||
|
import net.sf.acegisecurity.MockJoinPoint;
|
||||||
|
import net.sf.acegisecurity.MockRunAsManager;
|
||||||
|
import net.sf.acegisecurity.TargetObject;
|
||||||
|
import net.sf.acegisecurity.context.ContextHolder;
|
||||||
|
import net.sf.acegisecurity.context.SecureContext;
|
||||||
|
import net.sf.acegisecurity.context.SecureContextImpl;
|
||||||
|
import net.sf.acegisecurity.intercept.method.MethodDefinitionMap;
|
||||||
|
import net.sf.acegisecurity.intercept.method.MethodDefinitionSourceEditor;
|
||||||
|
import net.sf.acegisecurity.providers.TestingAuthenticationToken;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests {@link AspectJSecurityInterceptor}.
|
||||||
|
*
|
||||||
|
* @author Ben Alex
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class AspectJSecurityInterceptorTests extends TestCase {
|
||||||
|
//~ Constructors ===========================================================
|
||||||
|
|
||||||
|
public AspectJSecurityInterceptorTests() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public AspectJSecurityInterceptorTests(String arg0) {
|
||||||
|
super(arg0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public final void setUp() throws Exception {
|
||||||
|
super.setUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
junit.textui.TestRunner.run(AspectJSecurityInterceptorTests.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCallbackIsInvokedWhenPermissionGranted()
|
||||||
|
throws Exception {
|
||||||
|
AspectJSecurityInterceptor si = new AspectJSecurityInterceptor();
|
||||||
|
si.setApplicationContext(MockApplicationContext.getContext());
|
||||||
|
si.setAccessDecisionManager(new MockAccessDecisionManager());
|
||||||
|
si.setAuthenticationManager(new MockAuthenticationManager());
|
||||||
|
si.setRunAsManager(new MockRunAsManager());
|
||||||
|
|
||||||
|
MethodDefinitionSourceEditor editor = new MethodDefinitionSourceEditor();
|
||||||
|
editor.setAsText(
|
||||||
|
"net.sf.acegisecurity.TargetObject.countLength=MOCK_ONE,MOCK_TWO");
|
||||||
|
|
||||||
|
MethodDefinitionMap map = (MethodDefinitionMap) editor.getValue();
|
||||||
|
si.setObjectDefinitionSource(map);
|
||||||
|
assertEquals(map, si.getObjectDefinitionSource());
|
||||||
|
|
||||||
|
si.afterPropertiesSet();
|
||||||
|
|
||||||
|
Class clazz = TargetObject.class;
|
||||||
|
Method method = clazz.getMethod("countLength",
|
||||||
|
new Class[] {String.class});
|
||||||
|
MockJoinPoint joinPoint = new MockJoinPoint(new TargetObject(), method);
|
||||||
|
|
||||||
|
MockAspectJCallback aspectJCallback = new MockAspectJCallback();
|
||||||
|
|
||||||
|
SecureContext secureContext = new SecureContextImpl();
|
||||||
|
secureContext.setAuthentication(new TestingAuthenticationToken(
|
||||||
|
"marissa", "koala",
|
||||||
|
new GrantedAuthority[] {new GrantedAuthorityImpl("MOCK_ONE")}));
|
||||||
|
ContextHolder.setContext(secureContext);
|
||||||
|
|
||||||
|
Object result = si.invoke(joinPoint, aspectJCallback);
|
||||||
|
|
||||||
|
assertEquals("object proceeded", result);
|
||||||
|
|
||||||
|
ContextHolder.setContext(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCallbackIsNotInvokedWhenPermissionDenied()
|
||||||
|
throws Exception {
|
||||||
|
AspectJSecurityInterceptor si = new AspectJSecurityInterceptor();
|
||||||
|
si.setApplicationContext(MockApplicationContext.getContext());
|
||||||
|
si.setAccessDecisionManager(new MockAccessDecisionManager());
|
||||||
|
si.setAuthenticationManager(new MockAuthenticationManager());
|
||||||
|
si.setRunAsManager(new MockRunAsManager());
|
||||||
|
|
||||||
|
MethodDefinitionSourceEditor editor = new MethodDefinitionSourceEditor();
|
||||||
|
editor.setAsText(
|
||||||
|
"net.sf.acegisecurity.TargetObject.countLength=MOCK_ONE,MOCK_TWO");
|
||||||
|
|
||||||
|
MethodDefinitionMap map = (MethodDefinitionMap) editor.getValue();
|
||||||
|
si.setObjectDefinitionSource(map);
|
||||||
|
|
||||||
|
si.afterPropertiesSet();
|
||||||
|
|
||||||
|
Class clazz = TargetObject.class;
|
||||||
|
Method method = clazz.getMethod("countLength",
|
||||||
|
new Class[] {String.class});
|
||||||
|
MockJoinPoint joinPoint = new MockJoinPoint(new TargetObject(), method);
|
||||||
|
|
||||||
|
MockAspectJCallback aspectJCallback = new MockAspectJCallback();
|
||||||
|
aspectJCallback.setThrowExceptionIfInvoked(true);
|
||||||
|
|
||||||
|
SecureContext secureContext = new SecureContextImpl();
|
||||||
|
secureContext.setAuthentication(new TestingAuthenticationToken(
|
||||||
|
"marissa", "koala", new GrantedAuthority[] {}));
|
||||||
|
ContextHolder.setContext(secureContext);
|
||||||
|
|
||||||
|
try {
|
||||||
|
si.invoke(joinPoint, aspectJCallback);
|
||||||
|
fail("Should have thrown AccessDeniedException");
|
||||||
|
} catch (AccessDeniedException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
ContextHolder.setContext(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Inner Classes ==========================================================
|
||||||
|
|
||||||
|
private class MockAspectJCallback implements AspectJCallback {
|
||||||
|
private boolean throwExceptionIfInvoked = false;
|
||||||
|
|
||||||
|
private MockAspectJCallback() {}
|
||||||
|
|
||||||
|
public void setThrowExceptionIfInvoked(boolean throwExceptionIfInvoked) {
|
||||||
|
this.throwExceptionIfInvoked = throwExceptionIfInvoked;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object proceedWithObject() {
|
||||||
|
if (throwExceptionIfInvoked) {
|
||||||
|
throw new IllegalStateException("AspectJCallback proceeded");
|
||||||
|
}
|
||||||
|
|
||||||
|
return "object proceeded";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -25,6 +25,7 @@ import net.sf.acegisecurity.ConfigAttributeDefinition;
|
||||||
import net.sf.acegisecurity.GrantedAuthority;
|
import net.sf.acegisecurity.GrantedAuthority;
|
||||||
import net.sf.acegisecurity.GrantedAuthorityImpl;
|
import net.sf.acegisecurity.GrantedAuthorityImpl;
|
||||||
import net.sf.acegisecurity.MockAccessDecisionManager;
|
import net.sf.acegisecurity.MockAccessDecisionManager;
|
||||||
|
import net.sf.acegisecurity.MockApplicationContext;
|
||||||
import net.sf.acegisecurity.MockAuthenticationManager;
|
import net.sf.acegisecurity.MockAuthenticationManager;
|
||||||
import net.sf.acegisecurity.MockHttpServletRequest;
|
import net.sf.acegisecurity.MockHttpServletRequest;
|
||||||
import net.sf.acegisecurity.MockHttpServletResponse;
|
import net.sf.acegisecurity.MockHttpServletResponse;
|
||||||
|
@ -74,7 +75,8 @@ public class FilterSecurityInterceptorTests extends TestCase {
|
||||||
junit.textui.TestRunner.run(FilterSecurityInterceptorTests.class);
|
junit.textui.TestRunner.run(FilterSecurityInterceptorTests.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testEnsuresAccessDecisionManagerSupportsFilterInvocationClass() {
|
public void testEnsuresAccessDecisionManagerSupportsFilterInvocationClass()
|
||||||
|
throws Exception {
|
||||||
FilterSecurityInterceptor interceptor = new FilterSecurityInterceptor();
|
FilterSecurityInterceptor interceptor = new FilterSecurityInterceptor();
|
||||||
interceptor.setAuthenticationManager(new MockAuthenticationManager());
|
interceptor.setAuthenticationManager(new MockAuthenticationManager());
|
||||||
interceptor.setObjectDefinitionSource(new RegExpBasedFilterInvocationDefinitionMap());
|
interceptor.setObjectDefinitionSource(new RegExpBasedFilterInvocationDefinitionMap());
|
||||||
|
@ -106,7 +108,8 @@ public class FilterSecurityInterceptorTests extends TestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testEnsuresRunAsManagerSupportsFilterInvocationClass() {
|
public void testEnsuresRunAsManagerSupportsFilterInvocationClass()
|
||||||
|
throws Exception {
|
||||||
FilterSecurityInterceptor interceptor = new FilterSecurityInterceptor();
|
FilterSecurityInterceptor interceptor = new FilterSecurityInterceptor();
|
||||||
interceptor.setAccessDecisionManager(new MockAccessDecisionManager());
|
interceptor.setAccessDecisionManager(new MockAccessDecisionManager());
|
||||||
interceptor.setAuthenticationManager(new MockAuthenticationManager());
|
interceptor.setAuthenticationManager(new MockAuthenticationManager());
|
||||||
|
@ -138,7 +141,51 @@ public class FilterSecurityInterceptorTests extends TestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testNormalStartupAndGetter() {
|
public void testHttpsInvocationReflectsPortNumber()
|
||||||
|
throws Throwable {
|
||||||
|
// Setup the FilterSecurityInterceptor
|
||||||
|
FilterSecurityInterceptor interceptor = new FilterSecurityInterceptor();
|
||||||
|
interceptor.setAccessDecisionManager(new MockAccessDecisionManager());
|
||||||
|
interceptor.setAuthenticationManager(new MockAuthenticationManager());
|
||||||
|
interceptor.setRunAsManager(new MockRunAsManager());
|
||||||
|
interceptor.setApplicationContext(MockApplicationContext.getContext());
|
||||||
|
|
||||||
|
// Setup a mock config attribute definition
|
||||||
|
ConfigAttributeDefinition def = new ConfigAttributeDefinition();
|
||||||
|
def.addConfigAttribute(new SecurityConfig("MOCK_OK"));
|
||||||
|
|
||||||
|
MockFilterInvocationDefinitionMap mockSource = new MockFilterInvocationDefinitionMap("/secure/page.html",
|
||||||
|
def);
|
||||||
|
interceptor.setObjectDefinitionSource(mockSource);
|
||||||
|
|
||||||
|
// Setup our expectation that the filter chain will be invoked, as access is granted
|
||||||
|
MockFilterChain chain = new MockFilterChain(true);
|
||||||
|
|
||||||
|
// Setup our HTTPS request and response
|
||||||
|
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||||
|
MockHttpServletRequest request = new MockHttpServletRequest(null,
|
||||||
|
new MockHttpSession());
|
||||||
|
request.setServletPath("/secure/page.html");
|
||||||
|
request.setScheme("https");
|
||||||
|
request.setServerPort(443);
|
||||||
|
|
||||||
|
// Setup a Context
|
||||||
|
SecureContext context = new SecureContextImpl();
|
||||||
|
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken("Test",
|
||||||
|
"Password",
|
||||||
|
new GrantedAuthority[] {new GrantedAuthorityImpl("MOCK_OK")});
|
||||||
|
context.setAuthentication(token);
|
||||||
|
ContextHolder.setContext(context);
|
||||||
|
|
||||||
|
// Create and test our secure object
|
||||||
|
FilterInvocation fi = new FilterInvocation(request, response, chain);
|
||||||
|
interceptor.invoke(fi);
|
||||||
|
|
||||||
|
// Destroy the Context
|
||||||
|
ContextHolder.setContext(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testNormalStartupAndGetter() throws Exception {
|
||||||
FilterSecurityInterceptor interceptor = new FilterSecurityInterceptor();
|
FilterSecurityInterceptor interceptor = new FilterSecurityInterceptor();
|
||||||
interceptor.setAccessDecisionManager(new MockAccessDecisionManager());
|
interceptor.setAccessDecisionManager(new MockAccessDecisionManager());
|
||||||
interceptor.setAuthenticationManager(new MockAuthenticationManager());
|
interceptor.setAuthenticationManager(new MockAuthenticationManager());
|
||||||
|
@ -164,6 +211,7 @@ public class FilterSecurityInterceptorTests extends TestCase {
|
||||||
interceptor.setAccessDecisionManager(new MockAccessDecisionManager());
|
interceptor.setAccessDecisionManager(new MockAccessDecisionManager());
|
||||||
interceptor.setAuthenticationManager(new MockAuthenticationManager());
|
interceptor.setAuthenticationManager(new MockAuthenticationManager());
|
||||||
interceptor.setRunAsManager(new MockRunAsManager());
|
interceptor.setRunAsManager(new MockRunAsManager());
|
||||||
|
interceptor.setApplicationContext(MockApplicationContext.getContext());
|
||||||
|
|
||||||
// Setup a mock config attribute definition
|
// Setup a mock config attribute definition
|
||||||
ConfigAttributeDefinition def = new ConfigAttributeDefinition();
|
ConfigAttributeDefinition def = new ConfigAttributeDefinition();
|
||||||
|
|
|
@ -174,6 +174,8 @@ public class CasAuthenticationTokenTests extends TestCase {
|
||||||
assertEquals("PGTIOU-0-R0zlgrl4pdAQwBvJWO3vnNpevwqStbSGcq3vKB2SqSFFRnjPHt",
|
assertEquals("PGTIOU-0-R0zlgrl4pdAQwBvJWO3vnNpevwqStbSGcq3vKB2SqSFFRnjPHt",
|
||||||
token.getProxyGrantingTicketIou());
|
token.getProxyGrantingTicketIou());
|
||||||
assertEquals(proxyList, token.getProxyList());
|
assertEquals(proxyList, token.getProxyList());
|
||||||
|
assertEquals(makeUserDetails().getUsername(),
|
||||||
|
token.getUserDetails().getUsername());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testNoArgConstructor() {
|
public void testNoArgConstructor() {
|
||||||
|
|
|
@ -31,6 +31,8 @@ import net.sf.acegisecurity.providers.dao.cache.NullUserCache;
|
||||||
import net.sf.acegisecurity.providers.dao.salt.SystemWideSaltSource;
|
import net.sf.acegisecurity.providers.dao.salt.SystemWideSaltSource;
|
||||||
import net.sf.acegisecurity.providers.encoding.ShaPasswordEncoder;
|
import net.sf.acegisecurity.providers.encoding.ShaPasswordEncoder;
|
||||||
|
|
||||||
|
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
||||||
|
|
||||||
import org.springframework.dao.DataAccessException;
|
import org.springframework.dao.DataAccessException;
|
||||||
import org.springframework.dao.DataRetrievalFailureException;
|
import org.springframework.dao.DataRetrievalFailureException;
|
||||||
|
|
||||||
|
@ -103,6 +105,22 @@ public class DaoAuthenticationProviderTests extends TestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testAuthenticateFailsWithEmptyUsername() {
|
||||||
|
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(null,
|
||||||
|
"koala");
|
||||||
|
|
||||||
|
DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
|
||||||
|
provider.setAuthenticationDao(new MockAuthenticationDaoUserMarissa());
|
||||||
|
provider.setUserCache(new MockUserCache());
|
||||||
|
|
||||||
|
try {
|
||||||
|
provider.authenticate(token);
|
||||||
|
fail("Should have thrown BadCredentialsException");
|
||||||
|
} catch (BadCredentialsException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void testAuthenticateFailsWithInvalidPassword() {
|
public void testAuthenticateFailsWithInvalidPassword() {
|
||||||
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken("marissa",
|
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken("marissa",
|
||||||
"INVALID_PASSWORD");
|
"INVALID_PASSWORD");
|
||||||
|
@ -247,6 +265,27 @@ public class DaoAuthenticationProviderTests extends TestCase {
|
||||||
assertEquals("ROLE_TWO", castResult.getAuthorities()[1].getAuthority());
|
assertEquals("ROLE_TWO", castResult.getAuthorities()[1].getAuthority());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testAuthenticatesWithForcePrincipalAsString() {
|
||||||
|
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken("marissa",
|
||||||
|
"koala");
|
||||||
|
|
||||||
|
DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
|
||||||
|
provider.setAuthenticationDao(new MockAuthenticationDaoUserMarissa());
|
||||||
|
provider.setUserCache(new MockUserCache());
|
||||||
|
provider.setForcePrincipalAsString(true);
|
||||||
|
|
||||||
|
Authentication result = provider.authenticate(token);
|
||||||
|
|
||||||
|
if (!(result instanceof UsernamePasswordAuthenticationToken)) {
|
||||||
|
fail(
|
||||||
|
"Should have returned instance of UsernamePasswordAuthenticationToken");
|
||||||
|
}
|
||||||
|
|
||||||
|
UsernamePasswordAuthenticationToken castResult = (UsernamePasswordAuthenticationToken) result;
|
||||||
|
assertEquals(String.class, castResult.getPrincipal().getClass());
|
||||||
|
assertEquals("marissa", castResult.getPrincipal());
|
||||||
|
}
|
||||||
|
|
||||||
public void testGettersSetters() {
|
public void testGettersSetters() {
|
||||||
DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
|
DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
|
||||||
provider.setPasswordEncoder(new ShaPasswordEncoder());
|
provider.setPasswordEncoder(new ShaPasswordEncoder());
|
||||||
|
@ -264,6 +303,41 @@ public class DaoAuthenticationProviderTests extends TestCase {
|
||||||
assertFalse(provider.isForcePrincipalAsString());
|
assertFalse(provider.isForcePrincipalAsString());
|
||||||
provider.setForcePrincipalAsString(true);
|
provider.setForcePrincipalAsString(true);
|
||||||
assertTrue(provider.isForcePrincipalAsString());
|
assertTrue(provider.isForcePrincipalAsString());
|
||||||
|
|
||||||
|
provider.setApplicationContext(new ClassPathXmlApplicationContext(
|
||||||
|
"net/sf/acegisecurity/util/filtertest-valid.xml"));
|
||||||
|
assertEquals(ClassPathXmlApplicationContext.class.getName(),
|
||||||
|
provider.getContext().getClass().getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testGoesBackToAuthenticationDaoToObtainLatestPasswordIfCachedPasswordSeemsIncorrect() {
|
||||||
|
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken("marissa",
|
||||||
|
"koala");
|
||||||
|
|
||||||
|
MockAuthenticationDaoUserMarissa authenticationDao = new MockAuthenticationDaoUserMarissa();
|
||||||
|
MockUserCache cache = new MockUserCache();
|
||||||
|
DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
|
||||||
|
provider.setAuthenticationDao(authenticationDao);
|
||||||
|
provider.setUserCache(cache);
|
||||||
|
|
||||||
|
// This will work, as password still "koala"
|
||||||
|
provider.authenticate(token);
|
||||||
|
|
||||||
|
// Check "marissa = koala" ended up in the cache
|
||||||
|
assertEquals("koala", cache.getUserFromCache("marissa").getPassword());
|
||||||
|
|
||||||
|
// Now change the password the AuthenticationDao will return
|
||||||
|
authenticationDao.setPassword("easternLongNeckTurtle");
|
||||||
|
|
||||||
|
// Now try authentication again, with the new password
|
||||||
|
token = new UsernamePasswordAuthenticationToken("marissa",
|
||||||
|
"easternLongNeckTurtle");
|
||||||
|
provider.authenticate(token);
|
||||||
|
|
||||||
|
// To get this far, the new password was accepted
|
||||||
|
// Check the cache was updated
|
||||||
|
assertEquals("easternLongNeckTurtle",
|
||||||
|
cache.getUserFromCache("marissa").getPassword());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testStartupFailsIfNoAuthenticationDao()
|
public void testStartupFailsIfNoAuthenticationDao()
|
||||||
|
@ -320,10 +394,16 @@ public class DaoAuthenticationProviderTests extends TestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
private class MockAuthenticationDaoUserMarissa implements AuthenticationDao {
|
private class MockAuthenticationDaoUserMarissa implements AuthenticationDao {
|
||||||
|
private String password = "koala";
|
||||||
|
|
||||||
|
public void setPassword(String password) {
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
|
||||||
public UserDetails loadUserByUsername(String username)
|
public UserDetails loadUserByUsername(String username)
|
||||||
throws UsernameNotFoundException, DataAccessException {
|
throws UsernameNotFoundException, DataAccessException {
|
||||||
if ("marissa".equals(username)) {
|
if ("marissa".equals(username)) {
|
||||||
return new User("marissa", "koala", true,
|
return new User("marissa", password, true,
|
||||||
new GrantedAuthority[] {new GrantedAuthorityImpl("ROLE_ONE"), new GrantedAuthorityImpl(
|
new GrantedAuthority[] {new GrantedAuthorityImpl("ROLE_ONE"), new GrantedAuthorityImpl(
|
||||||
"ROLE_TWO")});
|
"ROLE_TWO")});
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -198,6 +198,27 @@ public class PasswordDaoAuthenticationProviderTests extends TestCase {
|
||||||
assertEquals(result.getCredentials(), result2.getCredentials());
|
assertEquals(result.getCredentials(), result2.getCredentials());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testAuthenticatesWithForcePrincipalAsString() {
|
||||||
|
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken("marissa",
|
||||||
|
"koala");
|
||||||
|
|
||||||
|
PasswordDaoAuthenticationProvider provider = new PasswordDaoAuthenticationProvider();
|
||||||
|
provider.setPasswordAuthenticationDao(new MockAuthenticationDaoUserMarissa());
|
||||||
|
provider.setUserCache(new MockUserCache());
|
||||||
|
provider.setForcePrincipalAsString(true);
|
||||||
|
|
||||||
|
Authentication result = provider.authenticate(token);
|
||||||
|
|
||||||
|
if (!(result instanceof UsernamePasswordAuthenticationToken)) {
|
||||||
|
fail(
|
||||||
|
"Should have returned instance of UsernamePasswordAuthenticationToken");
|
||||||
|
}
|
||||||
|
|
||||||
|
UsernamePasswordAuthenticationToken castResult = (UsernamePasswordAuthenticationToken) result;
|
||||||
|
assertEquals(String.class, castResult.getPrincipal().getClass());
|
||||||
|
assertEquals("marissa", castResult.getPrincipal());
|
||||||
|
}
|
||||||
|
|
||||||
public void testGettersSetters() {
|
public void testGettersSetters() {
|
||||||
PasswordDaoAuthenticationProvider provider = new PasswordDaoAuthenticationProvider();
|
PasswordDaoAuthenticationProvider provider = new PasswordDaoAuthenticationProvider();
|
||||||
provider.setUserCache(new EhCacheBasedUserCache());
|
provider.setUserCache(new EhCacheBasedUserCache());
|
||||||
|
|
|
@ -65,6 +65,22 @@ public class LoggerListenerTests extends TestCase {
|
||||||
assertTrue(true);
|
assertTrue(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testLogsUsernameNotFoundEvents() {
|
||||||
|
AuthenticationFailureUsernameNotFoundEvent event = new AuthenticationFailureUsernameNotFoundEvent(getAuthentication(),
|
||||||
|
getUser());
|
||||||
|
LoggerListener listener = new LoggerListener();
|
||||||
|
listener.onApplicationEvent(event);
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testLogsUsernameOfPasswordEvent() {
|
||||||
|
AuthenticationFailureUsernameOrPasswordEvent event = new AuthenticationFailureUsernameOrPasswordEvent(getAuthentication(),
|
||||||
|
getUser());
|
||||||
|
LoggerListener listener = new LoggerListener();
|
||||||
|
listener.onApplicationEvent(event);
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
private Authentication getAuthentication() {
|
private Authentication getAuthentication() {
|
||||||
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken("Principal",
|
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken("Principal",
|
||||||
"Credentials");
|
"Credentials");
|
||||||
|
|
|
@ -0,0 +1,226 @@
|
||||||
|
/* 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.taglibs.authz;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import net.sf.acegisecurity.Authentication;
|
||||||
|
import net.sf.acegisecurity.GrantedAuthority;
|
||||||
|
import net.sf.acegisecurity.MockAclManager;
|
||||||
|
import net.sf.acegisecurity.MockApplicationContext;
|
||||||
|
import net.sf.acegisecurity.acl.AclEntry;
|
||||||
|
import net.sf.acegisecurity.acl.AclManager;
|
||||||
|
import net.sf.acegisecurity.acl.basic.MockAclObjectIdentity;
|
||||||
|
import net.sf.acegisecurity.acl.basic.SimpleAclEntry;
|
||||||
|
import net.sf.acegisecurity.context.ContextHolder;
|
||||||
|
import net.sf.acegisecurity.context.SecureContext;
|
||||||
|
import net.sf.acegisecurity.context.SecureContextImpl;
|
||||||
|
import net.sf.acegisecurity.providers.TestingAuthenticationToken;
|
||||||
|
|
||||||
|
import org.springframework.context.ApplicationContext;
|
||||||
|
import org.springframework.context.ConfigurableApplicationContext;
|
||||||
|
|
||||||
|
import javax.servlet.jsp.JspException;
|
||||||
|
import javax.servlet.jsp.PageContext;
|
||||||
|
import javax.servlet.jsp.tagext.Tag;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests {@link AclTag}.
|
||||||
|
*
|
||||||
|
* @author Ben Alex
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class AclTagTests extends TestCase {
|
||||||
|
//~ Instance fields ========================================================
|
||||||
|
|
||||||
|
private final MyAclTag aclTag = new MyAclTag();
|
||||||
|
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public void testInclusionDeniedWhenAclManagerUnawareOfObject()
|
||||||
|
throws JspException {
|
||||||
|
Authentication auth = new TestingAuthenticationToken("marissa",
|
||||||
|
"koala", new GrantedAuthority[] {});
|
||||||
|
SecureContext sc = new SecureContextImpl();
|
||||||
|
sc.setAuthentication(auth);
|
||||||
|
ContextHolder.setContext(sc);
|
||||||
|
|
||||||
|
aclTag.setHasPermission(new Long(SimpleAclEntry.ADMINISTRATION)
|
||||||
|
.toString());
|
||||||
|
aclTag.setDomainObject(new Integer(54));
|
||||||
|
assertEquals(Tag.SKIP_BODY, aclTag.doStartTag());
|
||||||
|
|
||||||
|
ContextHolder.setContext(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testInclusionDeniedWhenAuthenticationEmpty()
|
||||||
|
throws JspException {
|
||||||
|
ContextHolder.setContext(new SecureContextImpl());
|
||||||
|
|
||||||
|
aclTag.setHasPermission(new Long(SimpleAclEntry.ADMINISTRATION)
|
||||||
|
.toString());
|
||||||
|
aclTag.setDomainObject("object1");
|
||||||
|
assertEquals(Tag.SKIP_BODY, aclTag.doStartTag());
|
||||||
|
|
||||||
|
ContextHolder.setContext(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testInclusionDeniedWhenContextHolderEmpty()
|
||||||
|
throws JspException {
|
||||||
|
ContextHolder.setContext(null);
|
||||||
|
|
||||||
|
aclTag.setHasPermission(new Long(SimpleAclEntry.ADMINISTRATION)
|
||||||
|
.toString());
|
||||||
|
aclTag.setDomainObject("object1");
|
||||||
|
assertEquals(Tag.SKIP_BODY, aclTag.doStartTag());
|
||||||
|
|
||||||
|
ContextHolder.setContext(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testInclusionDeniedWhenNoListOfPermissionsGiven()
|
||||||
|
throws JspException {
|
||||||
|
Authentication auth = new TestingAuthenticationToken("marissa",
|
||||||
|
"koala", new GrantedAuthority[] {});
|
||||||
|
SecureContext sc = new SecureContextImpl();
|
||||||
|
sc.setAuthentication(auth);
|
||||||
|
ContextHolder.setContext(sc);
|
||||||
|
|
||||||
|
aclTag.setHasPermission(null);
|
||||||
|
aclTag.setDomainObject("object1");
|
||||||
|
assertEquals(Tag.SKIP_BODY, aclTag.doStartTag());
|
||||||
|
|
||||||
|
ContextHolder.setContext(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testInclusionDeniedWhenPrincipalDoesNotHoldAnyPermissions()
|
||||||
|
throws JspException {
|
||||||
|
Authentication auth = new TestingAuthenticationToken("john", "crow",
|
||||||
|
new GrantedAuthority[] {});
|
||||||
|
SecureContext sc = new SecureContextImpl();
|
||||||
|
sc.setAuthentication(auth);
|
||||||
|
ContextHolder.setContext(sc);
|
||||||
|
|
||||||
|
aclTag.setHasPermission(new Integer(SimpleAclEntry.ADMINISTRATION)
|
||||||
|
+ "," + new Integer(SimpleAclEntry.READ));
|
||||||
|
assertEquals(new Integer(SimpleAclEntry.ADMINISTRATION) + ","
|
||||||
|
+ new Integer(SimpleAclEntry.READ), aclTag.getHasPermission());
|
||||||
|
aclTag.setDomainObject("object1");
|
||||||
|
assertEquals("object1", aclTag.getDomainObject());
|
||||||
|
assertEquals(Tag.SKIP_BODY, aclTag.doStartTag());
|
||||||
|
|
||||||
|
ContextHolder.setContext(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testInclusionDeniedWhenPrincipalDoesNotHoldRequiredPermissions()
|
||||||
|
throws JspException {
|
||||||
|
Authentication auth = new TestingAuthenticationToken("marissa",
|
||||||
|
"koala", new GrantedAuthority[] {});
|
||||||
|
SecureContext sc = new SecureContextImpl();
|
||||||
|
sc.setAuthentication(auth);
|
||||||
|
ContextHolder.setContext(sc);
|
||||||
|
|
||||||
|
aclTag.setHasPermission(new Integer(SimpleAclEntry.DELETE).toString());
|
||||||
|
aclTag.setDomainObject("object1");
|
||||||
|
assertEquals(Tag.SKIP_BODY, aclTag.doStartTag());
|
||||||
|
|
||||||
|
ContextHolder.setContext(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testInclusionPermittedWhenDomainObjectIsNull()
|
||||||
|
throws JspException {
|
||||||
|
aclTag.setHasPermission(new Integer(SimpleAclEntry.READ).toString());
|
||||||
|
aclTag.setDomainObject(null);
|
||||||
|
assertEquals(Tag.EVAL_BODY_INCLUDE, aclTag.doStartTag());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testJspExceptionThrownIfHasPermissionNotValidFormat()
|
||||||
|
throws JspException {
|
||||||
|
Authentication auth = new TestingAuthenticationToken("john", "crow",
|
||||||
|
new GrantedAuthority[] {});
|
||||||
|
SecureContext sc = new SecureContextImpl();
|
||||||
|
sc.setAuthentication(auth);
|
||||||
|
ContextHolder.setContext(sc);
|
||||||
|
|
||||||
|
aclTag.setHasPermission("0,5, 6"); // shouldn't be any space
|
||||||
|
|
||||||
|
try {
|
||||||
|
aclTag.doStartTag();
|
||||||
|
fail("Should have thrown JspException");
|
||||||
|
} catch (JspException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
ContextHolder.setContext(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testOperationWhenPrincipalHoldsPermissionOfMultipleList()
|
||||||
|
throws JspException {
|
||||||
|
Authentication auth = new TestingAuthenticationToken("marissa",
|
||||||
|
"koala", new GrantedAuthority[] {});
|
||||||
|
SecureContext sc = new SecureContextImpl();
|
||||||
|
sc.setAuthentication(auth);
|
||||||
|
ContextHolder.setContext(sc);
|
||||||
|
|
||||||
|
aclTag.setHasPermission(new Integer(SimpleAclEntry.ADMINISTRATION)
|
||||||
|
+ "," + new Integer(SimpleAclEntry.READ));
|
||||||
|
aclTag.setDomainObject("object1");
|
||||||
|
assertEquals(Tag.EVAL_BODY_INCLUDE, aclTag.doStartTag());
|
||||||
|
|
||||||
|
ContextHolder.setContext(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testOperationWhenPrincipalHoldsPermissionOfSingleList()
|
||||||
|
throws JspException {
|
||||||
|
Authentication auth = new TestingAuthenticationToken("marissa",
|
||||||
|
"koala", new GrantedAuthority[] {});
|
||||||
|
SecureContext sc = new SecureContextImpl();
|
||||||
|
sc.setAuthentication(auth);
|
||||||
|
ContextHolder.setContext(sc);
|
||||||
|
|
||||||
|
aclTag.setHasPermission(new Integer(SimpleAclEntry.READ).toString());
|
||||||
|
aclTag.setDomainObject("object1");
|
||||||
|
assertEquals(Tag.EVAL_BODY_INCLUDE, aclTag.doStartTag());
|
||||||
|
|
||||||
|
ContextHolder.setContext(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Inner Classes ==========================================================
|
||||||
|
|
||||||
|
private class MockAclEntry implements AclEntry {
|
||||||
|
// just so AclTag iterates some different types of AclEntrys
|
||||||
|
}
|
||||||
|
|
||||||
|
private class MyAclTag extends AclTag {
|
||||||
|
protected ApplicationContext getContext(PageContext pageContext) {
|
||||||
|
ConfigurableApplicationContext context = MockApplicationContext
|
||||||
|
.getContext();
|
||||||
|
|
||||||
|
// Create an AclManager
|
||||||
|
AclManager aclManager = new MockAclManager("object1", "marissa",
|
||||||
|
new AclEntry[] {new MockAclEntry(), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.READ)});
|
||||||
|
|
||||||
|
// Register the AclManager into our ApplicationContext
|
||||||
|
context.getBeanFactory().registerSingleton("aclManager", aclManager);
|
||||||
|
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,133 @@
|
||||||
|
/* 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.taglibs.authz;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import net.sf.acegisecurity.Authentication;
|
||||||
|
import net.sf.acegisecurity.GrantedAuthority;
|
||||||
|
import net.sf.acegisecurity.context.ContextHolder;
|
||||||
|
import net.sf.acegisecurity.context.SecureContext;
|
||||||
|
import net.sf.acegisecurity.context.SecureContextImpl;
|
||||||
|
import net.sf.acegisecurity.providers.TestingAuthenticationToken;
|
||||||
|
import net.sf.acegisecurity.providers.dao.User;
|
||||||
|
|
||||||
|
import javax.servlet.jsp.JspException;
|
||||||
|
import javax.servlet.jsp.tagext.Tag;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests {@link AuthenticationTag}.
|
||||||
|
*
|
||||||
|
* @author Ben Alex
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class AuthenticationTagTests extends TestCase {
|
||||||
|
//~ Instance fields ========================================================
|
||||||
|
|
||||||
|
private final MyAuthenticationTag authenticationTag = new MyAuthenticationTag();
|
||||||
|
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public void testOperationWhenAuthenticationIsNull()
|
||||||
|
throws JspException {
|
||||||
|
ContextHolder.setContext(new SecureContextImpl());
|
||||||
|
|
||||||
|
authenticationTag.setOperation("principal");
|
||||||
|
assertEquals(Tag.SKIP_BODY, authenticationTag.doStartTag());
|
||||||
|
assertEquals(null, authenticationTag.getLastMessage());
|
||||||
|
|
||||||
|
ContextHolder.setContext(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testOperationWhenContextHolderIsNull()
|
||||||
|
throws JspException {
|
||||||
|
ContextHolder.setContext(null);
|
||||||
|
|
||||||
|
authenticationTag.setOperation("principal");
|
||||||
|
assertEquals(Tag.SKIP_BODY, authenticationTag.doStartTag());
|
||||||
|
assertEquals(null, authenticationTag.getLastMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testOperationWhenPrincipalIsAString() throws JspException {
|
||||||
|
Authentication auth = new TestingAuthenticationToken("marissaAsString",
|
||||||
|
"koala", new GrantedAuthority[] {});
|
||||||
|
SecureContext sc = new SecureContextImpl();
|
||||||
|
sc.setAuthentication(auth);
|
||||||
|
ContextHolder.setContext(sc);
|
||||||
|
|
||||||
|
authenticationTag.setOperation("principal");
|
||||||
|
assertEquals(Tag.SKIP_BODY, authenticationTag.doStartTag());
|
||||||
|
assertEquals("marissaAsString", authenticationTag.getLastMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testOperationWhenPrincipalIsAUserDetailsInstance()
|
||||||
|
throws JspException {
|
||||||
|
Authentication auth = new TestingAuthenticationToken(new User(
|
||||||
|
"marissaUserDetails", "koala", true,
|
||||||
|
new GrantedAuthority[] {}), "koala",
|
||||||
|
new GrantedAuthority[] {});
|
||||||
|
SecureContext sc = new SecureContextImpl();
|
||||||
|
sc.setAuthentication(auth);
|
||||||
|
ContextHolder.setContext(sc);
|
||||||
|
|
||||||
|
authenticationTag.setOperation("principal");
|
||||||
|
assertEquals(Tag.SKIP_BODY, authenticationTag.doStartTag());
|
||||||
|
assertEquals("marissaUserDetails", authenticationTag.getLastMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testOperationWhenPrincipalIsNull() throws JspException {
|
||||||
|
Authentication auth = new TestingAuthenticationToken(null, "koala",
|
||||||
|
new GrantedAuthority[] {});
|
||||||
|
SecureContext sc = new SecureContextImpl();
|
||||||
|
sc.setAuthentication(auth);
|
||||||
|
ContextHolder.setContext(sc);
|
||||||
|
|
||||||
|
authenticationTag.setOperation("principal");
|
||||||
|
assertEquals(Tag.SKIP_BODY, authenticationTag.doStartTag());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testSkipsBodyIfNullOrEmptyOperation() throws Exception {
|
||||||
|
authenticationTag.setOperation("");
|
||||||
|
assertEquals("", authenticationTag.getOperation());
|
||||||
|
assertEquals(Tag.SKIP_BODY, authenticationTag.doStartTag());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testThrowsExceptionForUnrecognisedOperation() {
|
||||||
|
authenticationTag.setOperation("qsq");
|
||||||
|
|
||||||
|
try {
|
||||||
|
authenticationTag.doStartTag();
|
||||||
|
fail("Should have throwns JspException");
|
||||||
|
} catch (JspException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Inner Classes ==========================================================
|
||||||
|
|
||||||
|
private class MyAuthenticationTag extends AuthenticationTag {
|
||||||
|
String lastMessage = null;
|
||||||
|
|
||||||
|
public String getLastMessage() {
|
||||||
|
return lastMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void writeMessage(String msg) throws JspException {
|
||||||
|
lastMessage = msg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -179,6 +179,10 @@ public class AbstractProcessingFilterTests extends TestCase {
|
||||||
filter.setAuthenticationProxyUntrustedFailureUrl("/proxy");
|
filter.setAuthenticationProxyUntrustedFailureUrl("/proxy");
|
||||||
assertEquals("/proxy",
|
assertEquals("/proxy",
|
||||||
filter.getAuthenticationProxyUntrustedFailureUrl());
|
filter.getAuthenticationProxyUntrustedFailureUrl());
|
||||||
|
|
||||||
|
filter.setAuthenticationServiceFailureUrl("/serviceFailure");
|
||||||
|
assertEquals("/serviceFailure",
|
||||||
|
filter.getAuthenticationServiceFailureUrl());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testIgnoresAnyServletPathOtherThanFilterProcessesUrl()
|
public void testIgnoresAnyServletPathOtherThanFilterProcessesUrl()
|
||||||
|
@ -365,7 +369,9 @@ public class AbstractProcessingFilterTests extends TestCase {
|
||||||
MockAbstractProcessingFilter filter = new MockAbstractProcessingFilter(true);
|
MockAbstractProcessingFilter filter = new MockAbstractProcessingFilter(true);
|
||||||
filter.setFilterProcessesUrl("/j_mock_post");
|
filter.setFilterProcessesUrl("/j_mock_post");
|
||||||
filter.setDefaultTargetUrl("/foobar");
|
filter.setDefaultTargetUrl("/foobar");
|
||||||
|
assertFalse(filter.isAlwaysUseDefaultTargetUrl()); // check default
|
||||||
filter.setAlwaysUseDefaultTargetUrl(true);
|
filter.setAlwaysUseDefaultTargetUrl(true);
|
||||||
|
assertTrue(filter.isAlwaysUseDefaultTargetUrl()); // check changed
|
||||||
|
|
||||||
// Test
|
// Test
|
||||||
executeFilterInContainerSimulator(config, filter, request, response,
|
executeFilterInContainerSimulator(config, filter, request, response,
|
||||||
|
|
|
@ -0,0 +1,143 @@
|
||||||
|
/* 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.ui.httpinvoker;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import net.sf.acegisecurity.Authentication;
|
||||||
|
import net.sf.acegisecurity.context.ContextHolder;
|
||||||
|
import net.sf.acegisecurity.context.SecureContext;
|
||||||
|
import net.sf.acegisecurity.context.SecureContextImpl;
|
||||||
|
import net.sf.acegisecurity.providers.UsernamePasswordAuthenticationToken;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.URL;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests {@link AuthenticationSimpleHttpInvokerRequestExecutor}.
|
||||||
|
*
|
||||||
|
* @author Ben Alex
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class AuthenticationSimpleHttpInvokerRequestExecutorTests
|
||||||
|
extends TestCase {
|
||||||
|
//~ Constructors ===========================================================
|
||||||
|
|
||||||
|
public AuthenticationSimpleHttpInvokerRequestExecutorTests() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public AuthenticationSimpleHttpInvokerRequestExecutorTests(String arg0) {
|
||||||
|
super(arg0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
junit.textui.TestRunner.run(AuthenticationSimpleHttpInvokerRequestExecutorTests.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testNormalOperation() throws Exception {
|
||||||
|
// Setup client-side context
|
||||||
|
SecureContext clientSideContext = new SecureContextImpl();
|
||||||
|
Authentication clientSideAuthentication = new UsernamePasswordAuthenticationToken("Aladdin",
|
||||||
|
"open sesame");
|
||||||
|
clientSideContext.setAuthentication(clientSideAuthentication);
|
||||||
|
ContextHolder.setContext(clientSideContext);
|
||||||
|
|
||||||
|
// Create a connection and ensure our executor sets its
|
||||||
|
// properties correctly
|
||||||
|
AuthenticationSimpleHttpInvokerRequestExecutor executor = new AuthenticationSimpleHttpInvokerRequestExecutor();
|
||||||
|
HttpURLConnection conn = new MockHttpURLConnection(new URL(
|
||||||
|
"http://localhost/"));
|
||||||
|
executor.prepareConnection(conn, 10);
|
||||||
|
|
||||||
|
// Check connection properties
|
||||||
|
// See http://www.faqs.org/rfcs/rfc1945.html section 11.1 for example
|
||||||
|
// we are comparing against
|
||||||
|
assertEquals("Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==",
|
||||||
|
conn.getRequestProperty("Authorization"));
|
||||||
|
|
||||||
|
ContextHolder.setContext(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testNullAuthenticationIsNull() throws Exception {
|
||||||
|
// Setup client-side context
|
||||||
|
SecureContext clientSideContext = new SecureContextImpl();
|
||||||
|
clientSideContext.setAuthentication(null);
|
||||||
|
ContextHolder.setContext(clientSideContext);
|
||||||
|
|
||||||
|
// Create a connection and ensure our executor sets its
|
||||||
|
// properties correctly
|
||||||
|
AuthenticationSimpleHttpInvokerRequestExecutor executor = new AuthenticationSimpleHttpInvokerRequestExecutor();
|
||||||
|
HttpURLConnection conn = new MockHttpURLConnection(new URL(
|
||||||
|
"http://localhost/"));
|
||||||
|
executor.prepareConnection(conn, 10);
|
||||||
|
|
||||||
|
// Check connection properties (shouldn't be an Authorization header)
|
||||||
|
assertNull(conn.getRequestProperty("Authorization"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testNullContextHolderIsNull() throws Exception {
|
||||||
|
ContextHolder.setContext(null); // just to be explicit
|
||||||
|
|
||||||
|
// Create a connection and ensure our executor sets its
|
||||||
|
// properties correctly
|
||||||
|
AuthenticationSimpleHttpInvokerRequestExecutor executor = new AuthenticationSimpleHttpInvokerRequestExecutor();
|
||||||
|
HttpURLConnection conn = new MockHttpURLConnection(new URL(
|
||||||
|
"http://localhost/"));
|
||||||
|
executor.prepareConnection(conn, 10);
|
||||||
|
|
||||||
|
// Check connection properties (shouldn't be an Authorization header)
|
||||||
|
assertNull(conn.getRequestProperty("Authorization"));
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Inner Classes ==========================================================
|
||||||
|
|
||||||
|
private class MockHttpURLConnection extends HttpURLConnection {
|
||||||
|
private Map requestProperties = new HashMap();
|
||||||
|
|
||||||
|
public MockHttpURLConnection(URL u) {
|
||||||
|
super(u);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRequestProperty(String key, String value) {
|
||||||
|
requestProperties.put(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRequestProperty(String key) {
|
||||||
|
return (String) requestProperties.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void connect() throws IOException {
|
||||||
|
throw new UnsupportedOperationException("mock not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void disconnect() {
|
||||||
|
throw new UnsupportedOperationException("mock not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean usingProxy() {
|
||||||
|
throw new UnsupportedOperationException("mock not implemented");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,102 @@
|
||||||
|
/* 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.ui.rmi;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import net.sf.acegisecurity.Authentication;
|
||||||
|
import net.sf.acegisecurity.MockMethodInvocation;
|
||||||
|
import net.sf.acegisecurity.TargetObject;
|
||||||
|
import net.sf.acegisecurity.context.ContextHolder;
|
||||||
|
import net.sf.acegisecurity.context.SecureContext;
|
||||||
|
import net.sf.acegisecurity.context.SecureContextImpl;
|
||||||
|
import net.sf.acegisecurity.providers.UsernamePasswordAuthenticationToken;
|
||||||
|
|
||||||
|
import org.aopalliance.intercept.MethodInvocation;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests {@link ContextPropagatingRemoteInvocation} and {@link
|
||||||
|
* ContextPropagatingRemoteInvocationFactory}.
|
||||||
|
*
|
||||||
|
* @author Ben Alex
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class ContextPropagatingRemoteInvocationTests extends TestCase {
|
||||||
|
//~ Constructors ===========================================================
|
||||||
|
|
||||||
|
public ContextPropagatingRemoteInvocationTests() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ContextPropagatingRemoteInvocationTests(String arg0) {
|
||||||
|
super(arg0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
junit.textui.TestRunner.run(ContextPropagatingRemoteInvocationTests.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testNormalOperation() throws Exception {
|
||||||
|
// Setup client-side context
|
||||||
|
SecureContext clientSideContext = new SecureContextImpl();
|
||||||
|
Authentication clientSideAuthentication = new UsernamePasswordAuthenticationToken("marissa",
|
||||||
|
"koala");
|
||||||
|
clientSideContext.setAuthentication(clientSideAuthentication);
|
||||||
|
ContextHolder.setContext(clientSideContext);
|
||||||
|
|
||||||
|
ContextPropagatingRemoteInvocation remoteInvocation = getRemoteInvocation();
|
||||||
|
|
||||||
|
// Set to null, as ContextPropagatingRemoteInvocation already obtained
|
||||||
|
// a copy and nulling is necessary to ensure the Context delivered by
|
||||||
|
// ContextPropagatingRemoteInvocation is used on server-side
|
||||||
|
ContextHolder.setContext(null);
|
||||||
|
|
||||||
|
// The result from invoking the TargetObject should contain the
|
||||||
|
// Authentication class delivered via the ContextHolder
|
||||||
|
assertEquals("some_string net.sf.acegisecurity.providers.UsernamePasswordAuthenticationToken false",
|
||||||
|
remoteInvocation.invoke(new TargetObject()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testNullContextHolderDoesNotCauseInvocationProblems()
|
||||||
|
throws Exception {
|
||||||
|
ContextHolder.setContext(null); // just to be explicit
|
||||||
|
|
||||||
|
ContextPropagatingRemoteInvocation remoteInvocation = getRemoteInvocation();
|
||||||
|
ContextHolder.setContext(null); // unnecessary, but for explicitness
|
||||||
|
|
||||||
|
assertEquals("some_string ContextHolder Not Security Aware",
|
||||||
|
remoteInvocation.invoke(new TargetObject()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private ContextPropagatingRemoteInvocation getRemoteInvocation()
|
||||||
|
throws Exception {
|
||||||
|
Class clazz = TargetObject.class;
|
||||||
|
Method method = clazz.getMethod("makeLowerCase",
|
||||||
|
new Class[] {String.class});
|
||||||
|
MethodInvocation mi = new MockMethodInvocation(method,
|
||||||
|
new Object[] {"SOME_STRING"});
|
||||||
|
|
||||||
|
ContextPropagatingRemoteInvocationFactory factory = new ContextPropagatingRemoteInvocationFactory();
|
||||||
|
|
||||||
|
return (ContextPropagatingRemoteInvocation) factory
|
||||||
|
.createRemoteInvocation(mi);
|
||||||
|
}
|
||||||
|
}
|
|
@ -98,7 +98,8 @@ public class AuthenticationProcessingFilterEntryPointTests extends TestCase {
|
||||||
assertTrue(ep.getForceHttps());
|
assertTrue(ep.getForceHttps());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testHttpsOperation() throws Exception {
|
public void testHttpsOperationFromOriginalHttpUrl()
|
||||||
|
throws Exception {
|
||||||
MockHttpServletRequest request = new MockHttpServletRequest(
|
MockHttpServletRequest request = new MockHttpServletRequest(
|
||||||
"/some_path");
|
"/some_path");
|
||||||
request.setScheme("http");
|
request.setScheme("http");
|
||||||
|
@ -150,6 +151,36 @@ public class AuthenticationProcessingFilterEntryPointTests extends TestCase {
|
||||||
response.getRedirect());
|
response.getRedirect());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testHttpsOperationFromOriginalHttpsUrl()
|
||||||
|
throws Exception {
|
||||||
|
MockHttpServletRequest request = new MockHttpServletRequest(
|
||||||
|
"/some_path");
|
||||||
|
request.setScheme("https");
|
||||||
|
request.setServerName("www.example.com");
|
||||||
|
request.setContextPath("/bigWebApp");
|
||||||
|
request.setServerPort(443);
|
||||||
|
|
||||||
|
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||||
|
|
||||||
|
AuthenticationProcessingFilterEntryPoint ep = new AuthenticationProcessingFilterEntryPoint();
|
||||||
|
ep.setLoginFormUrl("/hello");
|
||||||
|
ep.setPortMapper(new PortMapperImpl());
|
||||||
|
ep.setForceHttps(true);
|
||||||
|
ep.setPortMapper(new PortMapperImpl());
|
||||||
|
ep.setPortResolver(new MockPortResolver(80, 443));
|
||||||
|
ep.afterPropertiesSet();
|
||||||
|
|
||||||
|
ep.commence(request, response);
|
||||||
|
assertEquals("https://www.example.com/bigWebApp/hello",
|
||||||
|
response.getRedirect());
|
||||||
|
|
||||||
|
request.setServerPort(8443);
|
||||||
|
ep.setPortResolver(new MockPortResolver(8080, 8443));
|
||||||
|
ep.commence(request, response);
|
||||||
|
assertEquals("https://www.example.com:8443/bigWebApp/hello",
|
||||||
|
response.getRedirect());
|
||||||
|
}
|
||||||
|
|
||||||
public void testNormalOperation() throws Exception {
|
public void testNormalOperation() throws Exception {
|
||||||
AuthenticationProcessingFilterEntryPoint ep = new AuthenticationProcessingFilterEntryPoint();
|
AuthenticationProcessingFilterEntryPoint ep = new AuthenticationProcessingFilterEntryPoint();
|
||||||
ep.setLoginFormUrl("/hello");
|
ep.setLoginFormUrl("/hello");
|
||||||
|
|
|
@ -226,6 +226,26 @@ public class FilterToBeanProxyTests extends TestCase {
|
||||||
chain);
|
chain);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testNullDelegateDoesNotCauseNullPointerException()
|
||||||
|
throws Exception {
|
||||||
|
// Setup our filter
|
||||||
|
MockFilterConfig config = new MockFilterConfig();
|
||||||
|
config.setInitParmeter("targetBean", "aFilterThatDoesntExist");
|
||||||
|
config.setInitParmeter("init", "lazy");
|
||||||
|
|
||||||
|
// Setup our expectation that the filter chain will be invoked
|
||||||
|
MockFilterChain chain = new MockFilterChain(true);
|
||||||
|
|
||||||
|
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||||
|
MockHttpServletRequest request = new MockHttpServletRequest("/go");
|
||||||
|
|
||||||
|
FilterToBeanProxy filter = new MockFilterToBeanProxy(
|
||||||
|
"net/sf/acegisecurity/util/filtertest-valid.xml");
|
||||||
|
|
||||||
|
// do not init (which would hapen if called .doFilter)
|
||||||
|
filter.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
private void executeFilterInContainerSimulator(FilterConfig filterConfig,
|
private void executeFilterInContainerSimulator(FilterConfig filterConfig,
|
||||||
Filter filter, ServletRequest request, ServletResponse response,
|
Filter filter, ServletRequest request, ServletResponse response,
|
||||||
FilterChain filterChain) throws ServletException, IOException {
|
FilterChain filterChain) throws ServletException, IOException {
|
||||||
|
|
|
@ -67,6 +67,18 @@ public class PortResolverImplTests extends TestCase {
|
||||||
assertEquals(8443, pr.getServerPort(request));
|
assertEquals(8443, pr.getServerPort(request));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testDetectsEmptyPortMapper() throws Exception {
|
||||||
|
PortResolverImpl pr = new PortResolverImpl();
|
||||||
|
pr.setPortMapper(null);
|
||||||
|
|
||||||
|
try {
|
||||||
|
pr.afterPropertiesSet();
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void testGettersSetters() throws Exception {
|
public void testGettersSetters() throws Exception {
|
||||||
PortResolverImpl pr = new PortResolverImpl();
|
PortResolverImpl pr = new PortResolverImpl();
|
||||||
assertTrue(pr.getPortMapper() != null);
|
assertTrue(pr.getPortMapper() != null);
|
||||||
|
|
|
@ -0,0 +1,485 @@
|
||||||
|
/* 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.vote;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import net.sf.acegisecurity.AuthorizationServiceException;
|
||||||
|
import net.sf.acegisecurity.ConfigAttributeDefinition;
|
||||||
|
import net.sf.acegisecurity.MockAclManager;
|
||||||
|
import net.sf.acegisecurity.MockMethodInvocation;
|
||||||
|
import net.sf.acegisecurity.SecurityConfig;
|
||||||
|
import net.sf.acegisecurity.acl.AclEntry;
|
||||||
|
import net.sf.acegisecurity.acl.AclManager;
|
||||||
|
import net.sf.acegisecurity.acl.basic.MockAclObjectIdentity;
|
||||||
|
import net.sf.acegisecurity.acl.basic.SimpleAclEntry;
|
||||||
|
import net.sf.acegisecurity.providers.UsernamePasswordAuthenticationToken;
|
||||||
|
|
||||||
|
import org.aopalliance.intercept.MethodInvocation;
|
||||||
|
|
||||||
|
import org.aspectj.lang.JoinPoint;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests {@link BasicAclEntryVoter}.
|
||||||
|
*
|
||||||
|
* @author Ben Alex
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class BasicAclEntryVoterTests extends TestCase {
|
||||||
|
//~ Constructors ===========================================================
|
||||||
|
|
||||||
|
public BasicAclEntryVoterTests() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public BasicAclEntryVoterTests(String arg0) {
|
||||||
|
super(arg0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public final void setUp() throws Exception {
|
||||||
|
super.setUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
junit.textui.TestRunner.run(BasicAclEntryVoterTests.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testNormalOperation() throws Exception {
|
||||||
|
// Setup a domain object subject of this test
|
||||||
|
SomeDomainObject domainObject = new SomeDomainObject("foo");
|
||||||
|
|
||||||
|
// Setup an AclManager
|
||||||
|
AclManager aclManager = new MockAclManager(domainObject, "marissa",
|
||||||
|
new AclEntry[] {new MockAclEntry(), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.READ), new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)});
|
||||||
|
|
||||||
|
// Wire up a voter
|
||||||
|
BasicAclEntryVoter voter = new BasicAclEntryVoter();
|
||||||
|
voter.setAclManager(aclManager);
|
||||||
|
assertEquals(aclManager, voter.getAclManager());
|
||||||
|
voter.setProcessConfigAttribute("FOO_ADMIN_OR_WRITE_ACCESS");
|
||||||
|
assertEquals("FOO_ADMIN_OR_WRITE_ACCESS",
|
||||||
|
voter.getProcessConfigAttribute());
|
||||||
|
voter.setRequirePermission(new int[] {SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
|
||||||
|
assertEquals(2, voter.getRequirePermission().length);
|
||||||
|
voter.setProcessDomainObjectClass(SomeDomainObject.class);
|
||||||
|
assertEquals(SomeDomainObject.class, voter.getProcessDomainObjectClass());
|
||||||
|
voter.afterPropertiesSet();
|
||||||
|
|
||||||
|
// Wire up an invocation to be voted on
|
||||||
|
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||||
|
attr.addConfigAttribute(new SecurityConfig("FOO_ADMIN_OR_WRITE_ACCESS"));
|
||||||
|
|
||||||
|
// Setup a MockMethodInvocation, so voter can retrieve domainObject
|
||||||
|
MethodInvocation mi = getMethodInvocation(domainObject);
|
||||||
|
|
||||||
|
assertEquals(AccessDecisionVoter.ACCESS_GRANTED,
|
||||||
|
voter.vote(
|
||||||
|
new UsernamePasswordAuthenticationToken("marissa", null), mi,
|
||||||
|
attr));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testOnlySupportsMethodInvocation() {
|
||||||
|
BasicAclEntryVoter voter = new BasicAclEntryVoter();
|
||||||
|
assertTrue(voter.supports(MethodInvocation.class));
|
||||||
|
assertFalse(voter.supports(JoinPoint.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testStartupRejectsMissingAclManager() throws Exception {
|
||||||
|
AclManager aclManager = new MockAclManager("domain1", "marissa",
|
||||||
|
new AclEntry[] {new MockAclEntry(), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.READ), new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)});
|
||||||
|
|
||||||
|
// Wire up a voter
|
||||||
|
BasicAclEntryVoter voter = new BasicAclEntryVoter();
|
||||||
|
voter.setProcessConfigAttribute("FOO_ADMIN_OR_WRITE_ACCESS");
|
||||||
|
voter.setRequirePermission(new int[] {SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
|
||||||
|
voter.setProcessDomainObjectClass(SomeDomainObject.class);
|
||||||
|
|
||||||
|
try {
|
||||||
|
voter.afterPropertiesSet();
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testStartupRejectsMissingProcessConfigAttribute()
|
||||||
|
throws Exception {
|
||||||
|
AclManager aclManager = new MockAclManager("domain1", "marissa",
|
||||||
|
new AclEntry[] {new MockAclEntry(), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.READ), new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)});
|
||||||
|
|
||||||
|
// Wire up a voter
|
||||||
|
BasicAclEntryVoter voter = new BasicAclEntryVoter();
|
||||||
|
voter.setAclManager(aclManager);
|
||||||
|
voter.setRequirePermission(new int[] {SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
|
||||||
|
voter.setProcessDomainObjectClass(SomeDomainObject.class);
|
||||||
|
|
||||||
|
try {
|
||||||
|
voter.afterPropertiesSet();
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testStartupRejectsMissingProcessDomainObjectClass()
|
||||||
|
throws Exception {
|
||||||
|
AclManager aclManager = new MockAclManager("domain1", "marissa",
|
||||||
|
new AclEntry[] {new MockAclEntry(), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.READ), new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)});
|
||||||
|
|
||||||
|
// Wire up a voter
|
||||||
|
BasicAclEntryVoter voter = new BasicAclEntryVoter();
|
||||||
|
voter.setAclManager(aclManager);
|
||||||
|
voter.setProcessConfigAttribute("FOO_ADMIN_OR_WRITE_ACCESS");
|
||||||
|
voter.setRequirePermission(new int[] {SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
|
||||||
|
|
||||||
|
try {
|
||||||
|
voter.afterPropertiesSet();
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testStartupRejectsMissingRequirePermission()
|
||||||
|
throws Exception {
|
||||||
|
AclManager aclManager = new MockAclManager("domain1", "marissa",
|
||||||
|
new AclEntry[] {new MockAclEntry(), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.READ), new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)});
|
||||||
|
|
||||||
|
// Wire up a voter
|
||||||
|
BasicAclEntryVoter voter = new BasicAclEntryVoter();
|
||||||
|
voter.setAclManager(aclManager);
|
||||||
|
voter.setProcessConfigAttribute("FOO_ADMIN_OR_WRITE_ACCESS");
|
||||||
|
voter.setProcessDomainObjectClass(SomeDomainObject.class);
|
||||||
|
|
||||||
|
try {
|
||||||
|
voter.afterPropertiesSet();
|
||||||
|
fail("Should have thrown IllegalArgumentException");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testSupportsConfigAttribute() {
|
||||||
|
BasicAclEntryVoter voter = new BasicAclEntryVoter();
|
||||||
|
voter.setProcessConfigAttribute("foobar");
|
||||||
|
assertTrue(voter.supports(new SecurityConfig("foobar")));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testVoterAbstainsIfDomainObjectIsNull()
|
||||||
|
throws Exception {
|
||||||
|
// Setup a domain object subject of this test
|
||||||
|
SomeDomainObject domainObject = new SomeDomainObject("foo");
|
||||||
|
|
||||||
|
// Setup an AclManager
|
||||||
|
AclManager aclManager = new MockAclManager(domainObject, "marissa",
|
||||||
|
new AclEntry[] {new MockAclEntry(), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.READ), new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)});
|
||||||
|
|
||||||
|
// Wire up a voter
|
||||||
|
BasicAclEntryVoter voter = new BasicAclEntryVoter();
|
||||||
|
voter.setAclManager(aclManager);
|
||||||
|
voter.setProcessConfigAttribute("FOO_ADMIN_OR_WRITE_ACCESS");
|
||||||
|
voter.setRequirePermission(new int[] {SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
|
||||||
|
voter.setProcessDomainObjectClass(SomeDomainObject.class);
|
||||||
|
voter.afterPropertiesSet();
|
||||||
|
|
||||||
|
// Wire up an invocation to be voted on
|
||||||
|
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||||
|
attr.addConfigAttribute(new SecurityConfig("A_DIFFERENT_ATTRIBUTE"));
|
||||||
|
|
||||||
|
// Setup a MockMethodInvocation, so voter can retrieve domainObject
|
||||||
|
MethodInvocation mi = getMethodInvocation(domainObject);
|
||||||
|
|
||||||
|
assertEquals(AccessDecisionVoter.ACCESS_ABSTAIN,
|
||||||
|
voter.vote(
|
||||||
|
new UsernamePasswordAuthenticationToken("marissa", null), mi,
|
||||||
|
attr));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testVoterAbstainsIfNotMatchingConfigAttribute()
|
||||||
|
throws Exception {
|
||||||
|
// Setup a domain object subject of this test
|
||||||
|
SomeDomainObject domainObject = null;
|
||||||
|
|
||||||
|
// Setup an AclManager
|
||||||
|
AclManager aclManager = new MockAclManager(domainObject, "marissa",
|
||||||
|
new AclEntry[] {new MockAclEntry(), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.READ), new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)});
|
||||||
|
|
||||||
|
// Wire up a voter
|
||||||
|
BasicAclEntryVoter voter = new BasicAclEntryVoter();
|
||||||
|
voter.setAclManager(aclManager);
|
||||||
|
voter.setProcessConfigAttribute("FOO_ADMIN_OR_WRITE_ACCESS");
|
||||||
|
voter.setRequirePermission(new int[] {SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
|
||||||
|
voter.setProcessDomainObjectClass(SomeDomainObject.class);
|
||||||
|
voter.afterPropertiesSet();
|
||||||
|
|
||||||
|
// Wire up an invocation to be voted on
|
||||||
|
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||||
|
attr.addConfigAttribute(new SecurityConfig("FOO_ADMIN_OR_WRITE_ACCESS"));
|
||||||
|
|
||||||
|
// Setup a MockMethodInvocation, so voter can retrieve domainObject
|
||||||
|
MethodInvocation mi = getMethodInvocation(domainObject);
|
||||||
|
|
||||||
|
assertEquals(AccessDecisionVoter.ACCESS_ABSTAIN,
|
||||||
|
voter.vote(
|
||||||
|
new UsernamePasswordAuthenticationToken("marissa", null), mi,
|
||||||
|
attr));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testVoterCanDenyAccessBasedOnInternalMethodOfDomainObject()
|
||||||
|
throws Exception {
|
||||||
|
// Setup a domain object subject of this test
|
||||||
|
SomeDomainObject domainObject = new SomeDomainObject("foo");
|
||||||
|
|
||||||
|
// Setup an AclManager
|
||||||
|
AclManager aclManager = new MockAclManager(domainObject.getParent(),
|
||||||
|
"marissa",
|
||||||
|
new AclEntry[] {new MockAclEntry(), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.DELETE)});
|
||||||
|
|
||||||
|
// Wire up a voter
|
||||||
|
BasicAclEntryVoter voter = new BasicAclEntryVoter();
|
||||||
|
voter.setAclManager(aclManager);
|
||||||
|
voter.setProcessConfigAttribute("FOO_ADMIN_OR_WRITE_ACCESS");
|
||||||
|
voter.setRequirePermission(new int[] {SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
|
||||||
|
voter.setProcessDomainObjectClass(SomeDomainObject.class);
|
||||||
|
voter.setInternalMethod("getParent");
|
||||||
|
voter.afterPropertiesSet();
|
||||||
|
|
||||||
|
// Wire up an invocation to be voted on
|
||||||
|
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||||
|
attr.addConfigAttribute(new SecurityConfig("FOO_ADMIN_OR_WRITE_ACCESS"));
|
||||||
|
|
||||||
|
// Setup a MockMethodInvocation, so voter can retrieve domainObject
|
||||||
|
MethodInvocation mi = getMethodInvocation(domainObject);
|
||||||
|
|
||||||
|
assertEquals(AccessDecisionVoter.ACCESS_DENIED,
|
||||||
|
voter.vote(
|
||||||
|
new UsernamePasswordAuthenticationToken("marissa", null), mi,
|
||||||
|
attr));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testVoterCanDenyAccessIfPrincipalHasNoPermissionsAtAllToDomainObject()
|
||||||
|
throws Exception {
|
||||||
|
// Setup a domain object subject of this test
|
||||||
|
SomeDomainObject domainObject = new SomeDomainObject("foo");
|
||||||
|
|
||||||
|
// Setup an AclManager
|
||||||
|
AclManager aclManager = new MockAclManager(domainObject, "marissa",
|
||||||
|
new AclEntry[] {new MockAclEntry(), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.DELETE)});
|
||||||
|
|
||||||
|
// Wire up a voter
|
||||||
|
BasicAclEntryVoter voter = new BasicAclEntryVoter();
|
||||||
|
voter.setAclManager(aclManager);
|
||||||
|
voter.setProcessConfigAttribute("FOO_ADMIN_OR_WRITE_ACCESS");
|
||||||
|
voter.setRequirePermission(new int[] {SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
|
||||||
|
voter.setProcessDomainObjectClass(SomeDomainObject.class);
|
||||||
|
voter.setInternalMethod("getParent");
|
||||||
|
voter.afterPropertiesSet();
|
||||||
|
|
||||||
|
// Wire up an invocation to be voted on
|
||||||
|
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||||
|
attr.addConfigAttribute(new SecurityConfig("FOO_ADMIN_OR_WRITE_ACCESS"));
|
||||||
|
|
||||||
|
// Setup a MockMethodInvocation, so voter can retrieve domainObject
|
||||||
|
MethodInvocation mi = getMethodInvocation(domainObject);
|
||||||
|
|
||||||
|
// NB: scott is the principal, not marissa
|
||||||
|
assertEquals(AccessDecisionVoter.ACCESS_DENIED,
|
||||||
|
voter.vote(new UsernamePasswordAuthenticationToken("scott", null),
|
||||||
|
mi, attr));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testVoterCanGrantAccessBasedOnInternalMethodOfDomainObject()
|
||||||
|
throws Exception {
|
||||||
|
// Setup a domain object subject of this test
|
||||||
|
SomeDomainObject domainObject = new SomeDomainObject("foo");
|
||||||
|
|
||||||
|
// Setup an AclManager
|
||||||
|
AclManager aclManager = new MockAclManager(domainObject.getParent(),
|
||||||
|
"marissa",
|
||||||
|
new AclEntry[] {new MockAclEntry(), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.READ), new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)});
|
||||||
|
|
||||||
|
// Wire up a voter
|
||||||
|
BasicAclEntryVoter voter = new BasicAclEntryVoter();
|
||||||
|
voter.setAclManager(aclManager);
|
||||||
|
voter.setProcessConfigAttribute("FOO_ADMIN_OR_WRITE_ACCESS");
|
||||||
|
voter.setRequirePermission(new int[] {SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
|
||||||
|
voter.setProcessDomainObjectClass(SomeDomainObject.class);
|
||||||
|
voter.setInternalMethod("getParent");
|
||||||
|
assertEquals("getParent", voter.getInternalMethod());
|
||||||
|
voter.afterPropertiesSet();
|
||||||
|
|
||||||
|
// Wire up an invocation to be voted on
|
||||||
|
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||||
|
attr.addConfigAttribute(new SecurityConfig("FOO_ADMIN_OR_WRITE_ACCESS"));
|
||||||
|
|
||||||
|
// Setup a MockMethodInvocation, so voter can retrieve domainObject
|
||||||
|
// (well actually it will access domainObject.getParent())
|
||||||
|
MethodInvocation mi = getMethodInvocation(domainObject);
|
||||||
|
|
||||||
|
assertEquals(AccessDecisionVoter.ACCESS_GRANTED,
|
||||||
|
voter.vote(
|
||||||
|
new UsernamePasswordAuthenticationToken("marissa", null), mi,
|
||||||
|
attr));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testVoterThrowsExceptionIfInvalidInternalMethodOfDomainObject()
|
||||||
|
throws Exception {
|
||||||
|
// Setup a domain object subject of this test
|
||||||
|
SomeDomainObject domainObject = new SomeDomainObject("foo");
|
||||||
|
|
||||||
|
// Setup an AclManager
|
||||||
|
AclManager aclManager = new MockAclManager(domainObject.getParent(),
|
||||||
|
"marissa",
|
||||||
|
new AclEntry[] {new MockAclEntry(), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.READ), new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)});
|
||||||
|
|
||||||
|
// Wire up a voter
|
||||||
|
BasicAclEntryVoter voter = new BasicAclEntryVoter();
|
||||||
|
voter.setAclManager(aclManager);
|
||||||
|
voter.setProcessConfigAttribute("FOO_ADMIN_OR_WRITE_ACCESS");
|
||||||
|
voter.setRequirePermission(new int[] {SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
|
||||||
|
voter.setProcessDomainObjectClass(SomeDomainObject.class);
|
||||||
|
voter.setInternalMethod("getNonExistentParentName");
|
||||||
|
voter.afterPropertiesSet();
|
||||||
|
|
||||||
|
// Wire up an invocation to be voted on
|
||||||
|
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||||
|
attr.addConfigAttribute(new SecurityConfig("FOO_ADMIN_OR_WRITE_ACCESS"));
|
||||||
|
|
||||||
|
// Setup a MockMethodInvocation, so voter can retrieve domainObject
|
||||||
|
// (well actually it will access domainObject.getParent())
|
||||||
|
MethodInvocation mi = getMethodInvocation(domainObject);
|
||||||
|
|
||||||
|
try {
|
||||||
|
voter.vote(new UsernamePasswordAuthenticationToken("marissa", null),
|
||||||
|
mi, attr);
|
||||||
|
fail("Should have thrown AuthorizationServiceException");
|
||||||
|
} catch (AuthorizationServiceException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testVoterThrowsExceptionIfProcessDomainObjectNotFound()
|
||||||
|
throws Exception {
|
||||||
|
// Setup a domain object subject of this test
|
||||||
|
SomeDomainObject domainObject = new SomeDomainObject("foo");
|
||||||
|
|
||||||
|
// Setup an AclManager
|
||||||
|
AclManager aclManager = new MockAclManager(domainObject.getParent(),
|
||||||
|
"marissa",
|
||||||
|
new AclEntry[] {new MockAclEntry(), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.ADMINISTRATION), new SimpleAclEntry(
|
||||||
|
"marissa", new MockAclObjectIdentity(), null,
|
||||||
|
SimpleAclEntry.READ), new SimpleAclEntry("marissa",
|
||||||
|
new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)});
|
||||||
|
|
||||||
|
// Wire up a voter
|
||||||
|
BasicAclEntryVoter voter = new BasicAclEntryVoter();
|
||||||
|
voter.setAclManager(aclManager);
|
||||||
|
voter.setProcessConfigAttribute("FOO_ADMIN_OR_WRITE_ACCESS");
|
||||||
|
voter.setRequirePermission(new int[] {SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
|
||||||
|
voter.setProcessDomainObjectClass(SomeDomainObject.class);
|
||||||
|
voter.afterPropertiesSet();
|
||||||
|
|
||||||
|
// Wire up an invocation to be voted on
|
||||||
|
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||||
|
attr.addConfigAttribute(new SecurityConfig("FOO_ADMIN_OR_WRITE_ACCESS"));
|
||||||
|
|
||||||
|
// Setup a MockMethodInvocation that doesn't provide SomeDomainObject arg
|
||||||
|
Class clazz = String.class;
|
||||||
|
Method method = clazz.getMethod("toString", new Class[] {});
|
||||||
|
|
||||||
|
MethodInvocation mi = new MockMethodInvocation(method,
|
||||||
|
new Object[] {domainObject});
|
||||||
|
|
||||||
|
try {
|
||||||
|
voter.vote(new UsernamePasswordAuthenticationToken("marissa", null),
|
||||||
|
mi, attr);
|
||||||
|
fail("Should have thrown AuthorizationServiceException");
|
||||||
|
} catch (AuthorizationServiceException expected) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private MethodInvocation getMethodInvocation(SomeDomainObject domainObject)
|
||||||
|
throws Exception {
|
||||||
|
Class clazz = SomeDomainObjectManager.class;
|
||||||
|
Method method = clazz.getMethod("someServiceMethod",
|
||||||
|
new Class[] {SomeDomainObject.class});
|
||||||
|
|
||||||
|
return new MockMethodInvocation(method, new Object[] {domainObject});
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Inner Classes ==========================================================
|
||||||
|
|
||||||
|
private class MockAclEntry implements AclEntry {
|
||||||
|
// just so AclTag iterates some different types of AclEntrys
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
/* 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.vote;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple domain object, used by {@link BasicAclEntryVoterTests}.
|
||||||
|
*
|
||||||
|
* @author Ben Alex
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class SomeDomainObject {
|
||||||
|
//~ Instance fields ========================================================
|
||||||
|
|
||||||
|
private String identity;
|
||||||
|
|
||||||
|
//~ Constructors ===========================================================
|
||||||
|
|
||||||
|
public SomeDomainObject(String identity) {
|
||||||
|
this.identity = identity;
|
||||||
|
}
|
||||||
|
|
||||||
|
private SomeDomainObject() {}
|
||||||
|
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public String getParent() {
|
||||||
|
return "parentOf" + identity;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
/* 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.vote;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used by {@link BasicAclEntryVoterTests} so it can create a
|
||||||
|
* <code>MethodInvocation</code> contining <code>SomeDomainObject</code>.
|
||||||
|
*
|
||||||
|
* @author Ben Alex
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class SomeDomainObjectManager {
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public void someServiceMethod(SomeDomainObject someDomainObject) {}
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
|
||||||
|
<!--
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
-->
|
||||||
|
|
||||||
|
<beans>
|
||||||
|
|
||||||
|
<!-- Automatically receives AuthenticationEvent messages from DaoAuthenticationProvider -->
|
||||||
|
<bean id="authenticationLoggerListener" class="net.sf.acegisecurity.providers.dao.event.LoggerListener"/>
|
||||||
|
|
||||||
|
<!-- Automatically receives AuthenticationEvent messages from AbstractSecurityInterceptor -->
|
||||||
|
<bean id="secureObjectLoggerListener" class="net.sf.acegisecurity.intercept.event.LoggerListener"/>
|
||||||
|
|
||||||
|
</beans>
|
|
@ -20,6 +20,7 @@
|
||||||
|
|
||||||
<beans>
|
<beans>
|
||||||
|
|
||||||
|
<bean id="afterInvocation" class="net.sf.acegisecurity.MockAfterInvocationManager"/>
|
||||||
<bean id="authentication" class="net.sf.acegisecurity.MockAuthenticationManager"/>
|
<bean id="authentication" class="net.sf.acegisecurity.MockAuthenticationManager"/>
|
||||||
<bean id="accessDecision" class="net.sf.acegisecurity.MockAccessDecisionManager"/>
|
<bean id="accessDecision" class="net.sf.acegisecurity.MockAccessDecisionManager"/>
|
||||||
<bean id="runAs" class="net.sf.acegisecurity.MockRunAsManager"/>
|
<bean id="runAs" class="net.sf.acegisecurity.MockRunAsManager"/>
|
||||||
|
@ -29,25 +30,27 @@
|
||||||
<bean id="securityInterceptor" class="net.sf.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">
|
<bean id="securityInterceptor" class="net.sf.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">
|
||||||
<property name="authenticationManager"><ref local="authentication"/></property>
|
<property name="authenticationManager"><ref local="authentication"/></property>
|
||||||
<property name="accessDecisionManager"><ref local="accessDecision"/></property>
|
<property name="accessDecisionManager"><ref local="accessDecision"/></property>
|
||||||
|
<property name="afterInvocationManager"><ref local="afterInvocation"/></property>
|
||||||
<property name="runAsManager"><ref local="runAs"/></property>
|
<property name="runAsManager"><ref local="runAs"/></property>
|
||||||
<property name="objectDefinitionSource">
|
<property name="objectDefinitionSource">
|
||||||
<value>
|
<value>
|
||||||
net.sf.acegisecurity.ITargetObject.makeLower*=MOCK_LOWER
|
net.sf.acegisecurity.ITargetObject.makeLower*=MOCK_LOWER
|
||||||
net.sf.acegisecurity.ITargetObject.makeUpper*=MOCK_UPPER,RUN_AS
|
net.sf.acegisecurity.ITargetObject.makeUpper*=MOCK_UPPER,RUN_AS
|
||||||
|
net.sf.acegisecurity.ITargetObject.computeHashCode*=MOCK_HASH,AFTER_INVOCATION_MOCK
|
||||||
</value>
|
</value>
|
||||||
</property>
|
</property>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="target" class="net.sf.acegisecurity.TargetObject"/>
|
<bean id="realTarget" class="net.sf.acegisecurity.TargetObject"/>
|
||||||
|
|
||||||
<!-- Autowire is fine as advisor requires MethodSecurityInterceptor -->
|
<bean id="target" class="org.springframework.aop.framework.ProxyFactoryBean">
|
||||||
<bean id="methodSecurityAdvisor"
|
<property name="proxyInterfaces"><value>net.sf.acegisecurity.ITargetObject</value></property>
|
||||||
class="net.sf.acegisecurity.intercept.method.aopalliance.MethodDefinitionSourceAdvisor"
|
<property name="interceptorNames">
|
||||||
autowire="constructor" >
|
<list>
|
||||||
</bean>
|
<idref local="securityInterceptor"/>
|
||||||
|
<idref local="realTarget"/>
|
||||||
<bean id="autoproxy"
|
</list>
|
||||||
class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
|
</property>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
</beans>
|
</beans>
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
|
||||||
|
<!--
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
-->
|
||||||
|
|
||||||
|
<beans>
|
||||||
|
|
||||||
|
<bean id="authentication" class="net.sf.acegisecurity.MockAuthenticationManager"/>
|
||||||
|
<bean id="accessDecision" class="net.sf.acegisecurity.MockAccessDecisionManager"/>
|
||||||
|
<bean id="runAs" class="net.sf.acegisecurity.MockRunAsManager"/>
|
||||||
|
<bean id="attributes" class="net.sf.acegisecurity.intercept.method.MockAttributes"/>
|
||||||
|
|
||||||
|
<bean id="objectDefinitionSource" class="net.sf.acegisecurity.intercept.method.MethodDefinitionAttributes">
|
||||||
|
<property name="attributes"><ref local="attributes"/></property>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<bean id="securityInterceptor" class="net.sf.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">
|
||||||
|
<property name="authenticationManager"><ref local="authentication"/></property>
|
||||||
|
<property name="accessDecisionManager"><ref local="accessDecision"/></property>
|
||||||
|
<property name="runAsManager"><ref local="runAs"/></property>
|
||||||
|
<property name="objectDefinitionSource">
|
||||||
|
<ref local="objectDefinitionSource"/>
|
||||||
|
</property>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<bean id="realTarget" class="net.sf.acegisecurity.TargetObject"/>
|
||||||
|
|
||||||
|
<bean id="target" class="org.springframework.aop.framework.ProxyFactoryBean">
|
||||||
|
<property name="proxyInterfaces"><value>net.sf.acegisecurity.ITargetObject</value></property>
|
||||||
|
<property name="interceptorNames">
|
||||||
|
<list>
|
||||||
|
<idref local="securityInterceptor"/>
|
||||||
|
<idref local="realTarget"/>
|
||||||
|
</list>
|
||||||
|
</property>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<bean id="loggerListener" class="net.sf.acegisecurity.intercept.event.LoggerListener"/>
|
||||||
|
|
||||||
|
</beans>
|
Loading…
Reference in New Issue