|
@@ -0,0 +1,181 @@
|
|
|
|
+package org.springframework.security.acls.jdbc;
|
|
|
|
+
|
|
|
|
+import java.io.Serializable;
|
|
|
|
+
|
|
|
|
+import junit.framework.Assert;
|
|
|
|
+import junit.framework.TestCase;
|
|
|
|
+import net.sf.ehcache.Cache;
|
|
|
|
+import net.sf.ehcache.Ehcache;
|
|
|
|
+
|
|
|
|
+import org.springframework.context.ApplicationContext;
|
|
|
|
+import org.springframework.security.Authentication;
|
|
|
|
+import org.springframework.security.GrantedAuthority;
|
|
|
|
+import org.springframework.security.GrantedAuthorityImpl;
|
|
|
|
+import org.springframework.security.MockApplicationContext;
|
|
|
|
+import org.springframework.security.acls.MutableAcl;
|
|
|
|
+import org.springframework.security.acls.domain.AclAuthorizationStrategy;
|
|
|
|
+import org.springframework.security.acls.domain.AclAuthorizationStrategyImpl;
|
|
|
|
+import org.springframework.security.acls.domain.AclImpl;
|
|
|
|
+import org.springframework.security.acls.domain.ConsoleAuditLogger;
|
|
|
|
+import org.springframework.security.acls.objectidentity.ObjectIdentity;
|
|
|
|
+import org.springframework.security.acls.objectidentity.ObjectIdentityImpl;
|
|
|
|
+import org.springframework.security.context.SecurityContextHolder;
|
|
|
|
+import org.springframework.security.providers.TestingAuthenticationToken;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * Tests {@link EhCacheBasedAclCache}
|
|
|
|
+ *
|
|
|
|
+ * @author Andrei Stefan
|
|
|
|
+ */
|
|
|
|
+public class EhCacheBasedAclCacheTests extends TestCase {
|
|
|
|
+
|
|
|
|
+ //~ Methods ========================================================================================================
|
|
|
|
+
|
|
|
|
+ private Ehcache getCache() {
|
|
|
|
+ ApplicationContext ctx = MockApplicationContext.getContext();
|
|
|
|
+
|
|
|
|
+ return (Ehcache) ctx.getBean("eHCacheBackend");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ protected void tearDown() throws Exception {
|
|
|
|
+ super.tearDown();
|
|
|
|
+ SecurityContextHolder.clearContext();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public void testConstructorRejectsNullParameters() throws Exception {
|
|
|
|
+ try {
|
|
|
|
+ AclCache aclCache = new EhCacheBasedAclCache(null);
|
|
|
|
+ Assert.fail("It should have thrown IllegalArgumentException");
|
|
|
|
+ }
|
|
|
|
+ catch (IllegalArgumentException expected) {
|
|
|
|
+ Assert.assertTrue(true);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public void testMethodsRejectNullParameters() throws Exception {
|
|
|
|
+ Ehcache cache = new MockEhcache();
|
|
|
|
+ EhCacheBasedAclCache myCache = new EhCacheBasedAclCache(cache);
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ Serializable id = null;
|
|
|
|
+ myCache.evictFromCache(id);
|
|
|
|
+ Assert.fail("It should have thrown IllegalArgumentException");
|
|
|
|
+ }
|
|
|
|
+ catch (IllegalArgumentException expected) {
|
|
|
|
+ Assert.assertTrue(true);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ ObjectIdentity obj = null;
|
|
|
|
+ myCache.evictFromCache(obj);
|
|
|
|
+ Assert.fail("It should have thrown IllegalArgumentException");
|
|
|
|
+ }
|
|
|
|
+ catch (IllegalArgumentException expected) {
|
|
|
|
+ Assert.assertTrue(true);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ Serializable id = null;
|
|
|
|
+ myCache.getFromCache(id);
|
|
|
|
+ Assert.fail("It should have thrown IllegalArgumentException");
|
|
|
|
+ }
|
|
|
|
+ catch (IllegalArgumentException expected) {
|
|
|
|
+ Assert.assertTrue(true);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ ObjectIdentity obj = null;
|
|
|
|
+ myCache.getFromCache(obj);
|
|
|
|
+ Assert.fail("It should have thrown IllegalArgumentException");
|
|
|
|
+ }
|
|
|
|
+ catch (IllegalArgumentException expected) {
|
|
|
|
+ Assert.assertTrue(true);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ MutableAcl acl = null;
|
|
|
|
+ myCache.putInCache(acl);
|
|
|
|
+ Assert.fail("It should have thrown IllegalArgumentException");
|
|
|
|
+ }
|
|
|
|
+ catch (IllegalArgumentException expected) {
|
|
|
|
+ Assert.assertTrue(true);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public void testCacheOperationsAclWithoutParent() throws Exception {
|
|
|
|
+ Ehcache cache = getCache();
|
|
|
|
+ EhCacheBasedAclCache myCache = new EhCacheBasedAclCache(cache);
|
|
|
|
+
|
|
|
|
+ ObjectIdentity identity = new ObjectIdentityImpl("org.springframework.security.TargetObject", new Long(100));
|
|
|
|
+ AclAuthorizationStrategy aclAuthorizationStrategy = new AclAuthorizationStrategyImpl(new GrantedAuthority[] {
|
|
|
|
+ new GrantedAuthorityImpl("ROLE_OWNERSHIP"), new GrantedAuthorityImpl("ROLE_AUDITING"),
|
|
|
|
+ new GrantedAuthorityImpl("ROLE_GENERAL") });
|
|
|
|
+ MutableAcl acl = new AclImpl(identity, new Long(1), aclAuthorizationStrategy, new ConsoleAuditLogger());
|
|
|
|
+
|
|
|
|
+ myCache.putInCache(acl);
|
|
|
|
+ Assert.assertEquals(cache.getSize(), 2);
|
|
|
|
+
|
|
|
|
+ // Check we can get from cache the same objects we put in
|
|
|
|
+ Assert.assertEquals(myCache.getFromCache(new Long(1)), acl);
|
|
|
|
+ Assert.assertEquals(myCache.getFromCache(identity), acl);
|
|
|
|
+
|
|
|
|
+ // Put another object in cache
|
|
|
|
+ ObjectIdentity identity2 = new ObjectIdentityImpl("org.springframework.security.TargetObject", new Long(101));
|
|
|
|
+ MutableAcl acl2 = new AclImpl(identity2, new Long(2), aclAuthorizationStrategy, new ConsoleAuditLogger());
|
|
|
|
+
|
|
|
|
+ myCache.putInCache(acl2);
|
|
|
|
+ Assert.assertEquals(cache.getSize(), 4);
|
|
|
|
+
|
|
|
|
+ // Try to evict an entry that doesn't exist
|
|
|
|
+ myCache.evictFromCache(new Long(3));
|
|
|
|
+ myCache.evictFromCache(new ObjectIdentityImpl("org.springframework.security.TargetObject", new Long(102)));
|
|
|
|
+ Assert.assertEquals(cache.getSize(), 4);
|
|
|
|
+
|
|
|
|
+ myCache.evictFromCache(new Long(1));
|
|
|
|
+ Assert.assertEquals(cache.getSize(), 2);
|
|
|
|
+
|
|
|
|
+ // Check the second object inserted
|
|
|
|
+ Assert.assertEquals(myCache.getFromCache(new Long(2)), acl2);
|
|
|
|
+ Assert.assertEquals(myCache.getFromCache(identity2), acl2);
|
|
|
|
+
|
|
|
|
+ myCache.evictFromCache(identity2);
|
|
|
|
+ Assert.assertEquals(cache.getSize(), 0);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public void testCacheOperationsAclWithParent() throws Exception {
|
|
|
|
+ Ehcache cache = getCache();
|
|
|
|
+ EhCacheBasedAclCache myCache = new EhCacheBasedAclCache(cache);
|
|
|
|
+
|
|
|
|
+ Authentication auth = new TestingAuthenticationToken("user", "password", new GrantedAuthority[] {
|
|
|
|
+ new GrantedAuthorityImpl("ROLE_GENERAL") });
|
|
|
|
+ auth.setAuthenticated(true);
|
|
|
|
+ SecurityContextHolder.getContext().setAuthentication(auth);
|
|
|
|
+
|
|
|
|
+ ObjectIdentity identity = new ObjectIdentityImpl("org.springframework.security.TargetObject", new Long(100));
|
|
|
|
+ ObjectIdentity identityParent = new ObjectIdentityImpl("org.springframework.security.TargetObject", new Long(101));
|
|
|
|
+ AclAuthorizationStrategy aclAuthorizationStrategy = new AclAuthorizationStrategyImpl(new GrantedAuthority[] {
|
|
|
|
+ new GrantedAuthorityImpl("ROLE_OWNERSHIP"), new GrantedAuthorityImpl("ROLE_AUDITING"),
|
|
|
|
+ new GrantedAuthorityImpl("ROLE_GENERAL") });
|
|
|
|
+ MutableAcl acl = new AclImpl(identity, new Long(1), aclAuthorizationStrategy, new ConsoleAuditLogger());
|
|
|
|
+ MutableAcl parentAcl = new AclImpl(identityParent, new Long(2), aclAuthorizationStrategy, new ConsoleAuditLogger());
|
|
|
|
+
|
|
|
|
+ acl.setParent(parentAcl);
|
|
|
|
+
|
|
|
|
+ myCache.putInCache(acl);
|
|
|
|
+ Assert.assertEquals(cache.getSize(), 4);
|
|
|
|
+
|
|
|
|
+ // Check we can get from cache the same objects we put in
|
|
|
|
+ Assert.assertEquals(myCache.getFromCache(new Long(1)), acl);
|
|
|
|
+ Assert.assertEquals(myCache.getFromCache(identity), acl);
|
|
|
|
+ Assert.assertEquals(myCache.getFromCache(new Long(2)), parentAcl);
|
|
|
|
+ Assert.assertEquals(myCache.getFromCache(identityParent), parentAcl);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //~ Inner Classes ==================================================================================================
|
|
|
|
+
|
|
|
|
+ private class MockEhcache extends Cache {
|
|
|
|
+ public MockEhcache() {
|
|
|
|
+ super("cache", 0, true, true, 0, 0);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|