You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by sn...@apache.org on 2015/10/14 18:54:35 UTC

[39/39] usergrid git commit: Move ShiroCacheManager to Services module and fix RoleIT test problem with token "inactivity" feature

Move ShiroCacheManager to Services module and fix RoleIT test problem with token "inactivity" feature


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/54276318
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/54276318
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/54276318

Branch: refs/heads/usergrid-1007-shiro-cache
Commit: 542763185f9749c3851e512860851eed2f684987
Parents: c02df0b
Author: Dave Johnson <sn...@apache.org>
Authored: Wed Oct 14 12:53:46 2015 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Wed Oct 14 12:53:46 2015 -0400

----------------------------------------------------------------------
 .../rest/security/shiro/ShiroCache.java         | 198 -------------------
 .../rest/security/shiro/ShiroCacheManager.java  | 116 -----------
 .../usergrid/security/shiro/ShiroCache.java     | 171 ++++++++++++++++
 .../security/shiro/ShiroCacheManager.java       | 114 +++++++++++
 .../shiro/principals/OrganizationPrincipal.java |   8 +-
 .../shiro/principals/PrincipalIdentifier.java   |   3 +
 .../resources/usergrid-services-context.xml     |   2 +-
 .../org/apache/usergrid/management/RoleIT.java  |   7 +-
 .../resources/usergrid-custom-test.properties   |   3 +
 9 files changed, 302 insertions(+), 320 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/54276318/stack/rest/src/main/java/org/apache/usergrid/rest/security/shiro/ShiroCache.java
----------------------------------------------------------------------
diff --git a/stack/rest/src/main/java/org/apache/usergrid/rest/security/shiro/ShiroCache.java b/stack/rest/src/main/java/org/apache/usergrid/rest/security/shiro/ShiroCache.java
deleted file mode 100644
index 7fb7422..0000000
--- a/stack/rest/src/main/java/org/apache/usergrid/rest/security/shiro/ShiroCache.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.usergrid.rest.security.shiro;
-
-import com.fasterxml.jackson.core.type.TypeReference;
-import org.apache.shiro.cache.Cache;
-import org.apache.shiro.cache.CacheException;
-import org.apache.shiro.subject.SimplePrincipalCollection;
-import org.apache.usergrid.corepersistence.util.CpNamingUtils;
-import org.apache.usergrid.persistence.cache.CacheFactory;
-import org.apache.usergrid.persistence.cache.CacheScope;
-import org.apache.usergrid.persistence.cache.ScopedCache;
-import org.apache.usergrid.persistence.model.entity.SimpleId;
-import org.apache.usergrid.security.shiro.UsergridAuthenticationInfo;
-import org.apache.usergrid.security.shiro.UsergridAuthorizationInfo;
-import org.apache.usergrid.security.shiro.principals.*;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Set;
-import java.util.UUID;
-
-
-/**
- * Plugin Usergrid cache for Shiro.
- */
-public class ShiroCache<K, V> implements Cache<K,V> {
-
-    private static final Logger logger = LoggerFactory.getLogger( ShiroCache.class );
-
-    private final CacheFactory<String, V> cacheFactory;
-    private final TypeReference typeRef;
-    private final Integer cacheTtl;
-
-    public ShiroCache( TypeReference typeRef, CacheFactory<String, V> cacheFactory, Integer cacheTtl ) {
-        this.typeRef = typeRef;
-        this.cacheFactory = cacheFactory;
-        this.cacheTtl = cacheTtl;
-    }
-
-    @Override
-    public V get(K key) throws CacheException {
-        if ( cacheTtl == 0 ) return null;
-
-        ScopedCache<String, V> scopedCache = getCacheScope(key);
-        if ( scopedCache != null ) {
-            V value = scopedCache.get(getKeyString(key), typeRef);
-
-            if ( logger.isDebugEnabled() ) {
-                if (value instanceof UsergridAuthorizationInfo) {
-                    UsergridAuthorizationInfo info = (UsergridAuthorizationInfo) value;
-                    logger.debug("Got from AUTHZ cache {} for app {}", getKeyString(key), info.toString());
-
-                } else if (value instanceof UsergridAuthenticationInfo) {
-                    UsergridAuthenticationInfo info = (UsergridAuthenticationInfo) value;
-                    logger.debug("Got from AUTHC cache {} for app {}", getKeyString(key), info.toString());
-
-                } else if (value == null) {
-                    logger.debug("Got NULL from cache app {} for key {}", getKeyString(key), key.toString());
-                }
-            }
-
-            return value;
-        }
-        return null;
-    }
-
-    @Override
-    public V put(K key, V value) throws CacheException {
-        if ( cacheTtl == 0 ) return null;
-
-        ScopedCache<String, V> scopedCache = getCacheScope(key);
-        if ( scopedCache != null ) {
-            V ret = scopedCache.put(getKeyString(key), value, cacheTtl);
-
-            if ( logger.isDebugEnabled() ) {
-                if (value instanceof UsergridAuthorizationInfo) {
-                    UsergridAuthorizationInfo info = (UsergridAuthorizationInfo) value;
-                    logger.debug("Put to AUTHZ cache {} for app {}", getKeyString(key), info.toString());
-
-                } else if (value instanceof UsergridAuthenticationInfo) {
-                    UsergridAuthenticationInfo info = (UsergridAuthenticationInfo) value;
-                    logger.debug("Put to AUTHC cache {} for app {}", getKeyString(key), info.toString());
-                }
-            }
-
-            return ret;
-        }
-        return null;
-    }
-
-    @Override
-    public V remove(K key) throws CacheException {
-        if ( cacheTtl == 0 ) return null;
-
-        ScopedCache<String, V> scopedCache = getCacheScope(key);
-        if ( scopedCache != null ) {
-            scopedCache.remove( getKeyString(key) );
-        }
-        return null;
-    }
-
-    @Override
-    public void clear() throws CacheException {
-        // no-op: Usergrid logic will invalidate cache as necessary
-    }
-
-    @Override
-    public int size() {
-        return 0; // TODO?
-    }
-
-    @Override
-    public Set<K> keys() {
-        return Collections.EMPTY_SET;
-    }
-
-    @Override
-    public Collection<V> values() {
-        return Collections.EMPTY_LIST;
-    }
-
-
-    /** get cache for application scope */
-    private ScopedCache<String, V> getCacheScope( K key ) {
-
-        // get the principal
-
-        PrincipalIdentifier principal;
-        if ( key instanceof SimplePrincipalCollection) {
-            SimplePrincipalCollection spc = (SimplePrincipalCollection) key;
-            principal = (PrincipalIdentifier) spc.getPrimaryPrincipal();
-
-        } else {
-            principal = (PrincipalIdentifier)key;
-        }
-
-        // get the id for the scope
-
-        UUID applicationId;
-        if ( principal instanceof UserPrincipal ) {
-            UserPrincipal p = (UserPrincipal)principal;
-            applicationId = p.getApplicationId();
-
-        } else if ( principal instanceof ApplicationPrincipal ) {
-            ApplicationPrincipal p = (ApplicationPrincipal)principal;
-            applicationId = p.getApplicationId();
-
-        } else if ( principal instanceof OrganizationPrincipal ) {
-            applicationId = CpNamingUtils.MANAGEMENT_APPLICATION_ID;
-
-        } else if ( principal instanceof ApplicationGuestPrincipal) {
-            ApplicationGuestPrincipal p = (ApplicationGuestPrincipal)principal;
-            applicationId = p.getApplicationId();
-
-        } else {
-            logger.error("Unknown key type: " + key.getClass().getSimpleName());
-            throw new RuntimeException("Unknown key type: " + principal.getClass().getSimpleName());
-        }
-
-        CacheScope scope = new CacheScope(new SimpleId(applicationId, "application"));
-        ScopedCache<String, V> scopedCache = cacheFactory.getScopedCache(scope);
-        return scopedCache;
-    }
-
-
-    /** key is the user UUID in string form + class name of key */
-    private String getKeyString( K key ) {
-
-        if ( key instanceof SimplePrincipalCollection) {
-            SimplePrincipalCollection spc = (SimplePrincipalCollection)key;
-
-            if ( spc.getPrimaryPrincipal() instanceof UserPrincipal) {
-                UserPrincipal p = (UserPrincipal) spc.getPrimaryPrincipal();
-                return p.getUser().getUuid().toString();
-            }
-        }
-
-        return key.toString() + "_" + key.getClass().getSimpleName();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/54276318/stack/rest/src/main/java/org/apache/usergrid/rest/security/shiro/ShiroCacheManager.java
----------------------------------------------------------------------
diff --git a/stack/rest/src/main/java/org/apache/usergrid/rest/security/shiro/ShiroCacheManager.java b/stack/rest/src/main/java/org/apache/usergrid/rest/security/shiro/ShiroCacheManager.java
deleted file mode 100644
index 416dcd2..0000000
--- a/stack/rest/src/main/java/org/apache/usergrid/rest/security/shiro/ShiroCacheManager.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.usergrid.rest.security.shiro;
-
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.google.inject.Injector;
-import com.google.inject.Key;
-import com.google.inject.TypeLiteral;
-import org.apache.shiro.cache.Cache;
-import org.apache.shiro.cache.CacheException;
-import org.apache.shiro.cache.CacheManager;
-import org.apache.usergrid.persistence.cache.CacheFactory;
-import org.apache.usergrid.security.shiro.UsergridAuthenticationInfo;
-import org.apache.usergrid.security.shiro.UsergridAuthorizationInfo;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-
-
-/**
- * Plugin Usergrid cache for Shiro.
- */
-public class ShiroCacheManager implements CacheManager {
-
-    private static final Logger logger = LoggerFactory.getLogger(ShiroCacheManager.class);
-
-    @Autowired
-    private Injector injector;
-
-    private Map<String, ShiroCache> caches = new HashMap<>();
-
-    private Properties properties;
-
-    private Integer cacheTtl = null; // specified in seconds
-
-    private static final String CACHE_TTL_PROPERTY_NAME = "usergrid.auth.cache.time-to-live";
-
-
-    public ShiroCacheManager() {}
-
-
-    @Override
-    public <K, V> Cache<K, V> getCache(String name) throws CacheException {
-        ShiroCache shiroCache = caches.get(name);
-
-        if (shiroCache == null) {
-
-            if ("realm.authorizationCache".equals(name)) {
-
-                TypeLiteral typeLit = new TypeLiteral<CacheFactory<String, UsergridAuthorizationInfo>>() {};
-
-                shiroCache = new ShiroCache(
-                    new TypeReference<UsergridAuthorizationInfo>() {},
-                    (CacheFactory)injector.getInstance( Key.get(typeLit) ),
-                    getCacheTtl());
-
-            } else if ("realm.authenticationCache".equals(name)) {
-
-                TypeLiteral typeLit = new TypeLiteral<CacheFactory<String, UsergridAuthenticationInfo>>() {};
-
-                shiroCache = new ShiroCache(
-                    new TypeReference<UsergridAuthenticationInfo>() {},
-                    (CacheFactory)injector.getInstance( Key.get(typeLit) ),
-                    getCacheTtl());
-
-            } else {
-                logger.error("Unknown Shiro Cache name: " + name);
-                throw new RuntimeException("Unknown Shiro Cache name: " + name);
-            }
-
-            caches.put(name, shiroCache);
-        }
-        return shiroCache;
-    }
-
-    private Integer getCacheTtl() {
-        if ( cacheTtl == null ) {
-            String cacheTtlString = properties.getProperty(CACHE_TTL_PROPERTY_NAME);
-            try {
-                cacheTtl = Integer.parseInt(cacheTtlString);
-            } catch ( NumberFormatException nfe ) {
-                cacheTtl = 3600;
-                logger.error("Error reading property {}, setting cache TTL to {} seconds", CACHE_TTL_PROPERTY_NAME);
-            }
-        }
-        return cacheTtl;
-    }
-
-    public Properties getProperties() {
-        return properties;
-    }
-
-    @Autowired
-    public void setProperties(Properties properties) {
-        this.properties = properties;
-    }
-}
-

http://git-wip-us.apache.org/repos/asf/usergrid/blob/54276318/stack/services/src/main/java/org/apache/usergrid/security/shiro/ShiroCache.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/security/shiro/ShiroCache.java b/stack/services/src/main/java/org/apache/usergrid/security/shiro/ShiroCache.java
new file mode 100644
index 0000000..67da9cf
--- /dev/null
+++ b/stack/services/src/main/java/org/apache/usergrid/security/shiro/ShiroCache.java
@@ -0,0 +1,171 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.usergrid.security.shiro;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import org.apache.shiro.cache.Cache;
+import org.apache.shiro.cache.CacheException;
+import org.apache.shiro.subject.SimplePrincipalCollection;
+import org.apache.usergrid.corepersistence.util.CpNamingUtils;
+import org.apache.usergrid.persistence.cache.CacheFactory;
+import org.apache.usergrid.persistence.cache.CacheScope;
+import org.apache.usergrid.persistence.cache.ScopedCache;
+import org.apache.usergrid.persistence.model.entity.SimpleId;
+import org.apache.usergrid.security.shiro.principals.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Set;
+import java.util.UUID;
+
+
+/**
+ * Plugin Usergrid cache for Shiro.
+ */
+public class ShiroCache<K, V> implements Cache<K,V> {
+
+    private static final Logger logger = LoggerFactory.getLogger( ShiroCache.class );
+
+    private final CacheFactory<String, V> cacheFactory;
+    private final TypeReference typeRef;
+    private final Integer cacheTtl;
+
+    public ShiroCache( TypeReference typeRef, CacheFactory<String, V> cacheFactory, Integer cacheTtl ) {
+        this.typeRef = typeRef;
+        this.cacheFactory = cacheFactory;
+        this.cacheTtl = cacheTtl;
+    }
+
+    @Override
+    public V get(K key) throws CacheException {
+        if ( cacheTtl == 0 ) return null;
+
+        ScopedCache<String, V> scopedCache = getCacheScope(key);
+        if ( scopedCache != null ) {
+            V value = scopedCache.get(getKeyString(key), typeRef);
+
+            if ( logger.isDebugEnabled() ) {
+                if (value instanceof UsergridAuthorizationInfo) {
+                    UsergridAuthorizationInfo info = (UsergridAuthorizationInfo) value;
+                    logger.debug("Got from AUTHZ cache {} for app {}", getKeyString(key), info.toString());
+
+                } else if (value instanceof UsergridAuthenticationInfo) {
+                    UsergridAuthenticationInfo info = (UsergridAuthenticationInfo) value;
+                    logger.debug("Got from AUTHC cache {} for app {}", getKeyString(key), info.toString());
+
+                } else if (value == null) {
+                    logger.debug("Got NULL from cache app {} for key {}", getKeyString(key), key.toString());
+                }
+            }
+
+            return value;
+        }
+        return null;
+    }
+
+    @Override
+    public V put(K key, V value) throws CacheException {
+        if ( cacheTtl == 0 ) return null;
+
+        ScopedCache<String, V> scopedCache = getCacheScope(key);
+        if ( scopedCache != null ) {
+            V ret = scopedCache.put(getKeyString(key), value, cacheTtl);
+
+            if ( logger.isDebugEnabled() ) {
+                if (value instanceof UsergridAuthorizationInfo) {
+                    UsergridAuthorizationInfo info = (UsergridAuthorizationInfo) value;
+                    logger.debug("Put to AUTHZ cache {} for app {}", getKeyString(key), info.toString());
+
+                } else if (value instanceof UsergridAuthenticationInfo) {
+                    UsergridAuthenticationInfo info = (UsergridAuthenticationInfo) value;
+                    logger.debug("Put to AUTHC cache {} for app {}", getKeyString(key), info.toString());
+                }
+            }
+
+            return ret;
+        }
+        return null;
+    }
+
+    @Override
+    public V remove(K key) throws CacheException {
+        if ( cacheTtl == 0 ) return null;
+
+        ScopedCache<String, V> scopedCache = getCacheScope(key);
+        if ( scopedCache != null ) {
+            scopedCache.remove( getKeyString(key) );
+        }
+        return null;
+    }
+
+    @Override
+    public void clear() throws CacheException {
+        // no-op: Usergrid logic will invalidate cache as necessary
+    }
+
+    @Override
+    public int size() {
+        return 0; // TODO?
+    }
+
+    @Override
+    public Set<K> keys() {
+        return Collections.EMPTY_SET;
+    }
+
+    @Override
+    public Collection<V> values() {
+        return Collections.EMPTY_LIST;
+    }
+
+
+    /** get cache for application scope */
+    private ScopedCache<String, V> getCacheScope( K key ) {
+
+        PrincipalIdentifier principal;
+        if ( key instanceof SimplePrincipalCollection) {
+            SimplePrincipalCollection spc = (SimplePrincipalCollection) key;
+            principal = (PrincipalIdentifier) spc.getPrimaryPrincipal();
+
+        } else {
+            principal = (PrincipalIdentifier)key;
+        }
+
+        CacheScope scope = new CacheScope(new SimpleId(principal.getApplicationId(), "application"));
+        ScopedCache<String, V> scopedCache = cacheFactory.getScopedCache(scope);
+        return scopedCache;
+    }
+
+
+    /** key is the user UUID in string form + class name of key */
+    private String getKeyString( K key ) {
+
+        if ( key instanceof SimplePrincipalCollection) {
+            SimplePrincipalCollection spc = (SimplePrincipalCollection)key;
+
+            if ( spc.getPrimaryPrincipal() instanceof UserPrincipal) {
+                UserPrincipal p = (UserPrincipal) spc.getPrimaryPrincipal();
+                return p.getUser().getUuid().toString();
+            }
+        }
+
+        return key.toString() + "_" + key.getClass().getSimpleName();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/54276318/stack/services/src/main/java/org/apache/usergrid/security/shiro/ShiroCacheManager.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/security/shiro/ShiroCacheManager.java b/stack/services/src/main/java/org/apache/usergrid/security/shiro/ShiroCacheManager.java
new file mode 100644
index 0000000..17d5cce
--- /dev/null
+++ b/stack/services/src/main/java/org/apache/usergrid/security/shiro/ShiroCacheManager.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.usergrid.security.shiro;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.TypeLiteral;
+import org.apache.shiro.cache.Cache;
+import org.apache.shiro.cache.CacheException;
+import org.apache.shiro.cache.CacheManager;
+import org.apache.usergrid.persistence.cache.CacheFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+
+/**
+ * Plugin Usergrid cache for Shiro.
+ */
+public class ShiroCacheManager implements CacheManager {
+
+    private static final Logger logger = LoggerFactory.getLogger(ShiroCacheManager.class);
+
+    @Autowired
+    private Injector injector;
+
+    private Map<String, ShiroCache> caches = new HashMap<>();
+
+    private Properties properties;
+
+    private Integer cacheTtl = null; // specified in seconds
+
+    private static final String CACHE_TTL_PROPERTY_NAME = "usergrid.auth.cache.time-to-live";
+
+
+    public ShiroCacheManager() {}
+
+
+    @Override
+    public <K, V> Cache<K, V> getCache(String name) throws CacheException {
+        ShiroCache shiroCache = caches.get(name);
+
+        if (shiroCache == null) {
+
+            if ("realm.authorizationCache".equals(name)) {
+
+                TypeLiteral typeLit = new TypeLiteral<CacheFactory<String, UsergridAuthorizationInfo>>() {};
+
+                shiroCache = new ShiroCache(
+                    new TypeReference<UsergridAuthorizationInfo>() {},
+                    (CacheFactory)injector.getInstance( Key.get(typeLit) ),
+                    getCacheTtl());
+
+            } else if ("realm.authenticationCache".equals(name)) {
+
+                TypeLiteral typeLit = new TypeLiteral<CacheFactory<String, UsergridAuthenticationInfo>>() {};
+
+                shiroCache = new ShiroCache(
+                    new TypeReference<UsergridAuthenticationInfo>() {},
+                    (CacheFactory)injector.getInstance( Key.get(typeLit) ),
+                    getCacheTtl());
+
+            } else {
+                logger.error("Unknown Shiro Cache name: " + name);
+                throw new RuntimeException("Unknown Shiro Cache name: " + name);
+            }
+
+            caches.put(name, shiroCache);
+        }
+        return shiroCache;
+    }
+
+    private Integer getCacheTtl() {
+        if ( cacheTtl == null ) {
+            String cacheTtlString = properties.getProperty(CACHE_TTL_PROPERTY_NAME);
+            try {
+                cacheTtl = Integer.parseInt(cacheTtlString);
+            } catch ( NumberFormatException nfe ) {
+                cacheTtl = 3600;
+                logger.error("Error reading property {}, setting cache TTL to {} seconds", CACHE_TTL_PROPERTY_NAME);
+            }
+        }
+        return cacheTtl;
+    }
+
+    public Properties getProperties() {
+        return properties;
+    }
+
+    @Autowired
+    public void setProperties(Properties properties) {
+        this.properties = properties;
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/usergrid/blob/54276318/stack/services/src/main/java/org/apache/usergrid/security/shiro/principals/OrganizationPrincipal.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/security/shiro/principals/OrganizationPrincipal.java b/stack/services/src/main/java/org/apache/usergrid/security/shiro/principals/OrganizationPrincipal.java
index 5c815f0..30510c3 100644
--- a/stack/services/src/main/java/org/apache/usergrid/security/shiro/principals/OrganizationPrincipal.java
+++ b/stack/services/src/main/java/org/apache/usergrid/security/shiro/principals/OrganizationPrincipal.java
@@ -22,6 +22,7 @@ import java.util.UUID;
 
 import com.google.common.collect.HashBiMap;
 import org.apache.commons.lang.StringUtils;
+import org.apache.usergrid.corepersistence.util.CpNamingUtils;
 import org.apache.usergrid.management.ApplicationInfo;
 import org.apache.usergrid.management.ManagementService;
 import org.apache.usergrid.management.OrganizationInfo;
@@ -60,13 +61,18 @@ public class OrganizationPrincipal extends PrincipalIdentifier {
     }
 
     @Override
+    public UUID getApplicationId() {
+        return CpNamingUtils.MANAGEMENT_APPLICATION_ID;
+    }
+
+    @Override
     public void grant(
         UsergridAuthorizationInfo info,
         EntityManagerFactory emf,
         ManagementService management,
         TokenService tokens) {
 
-        // OrganizationPricipals are usually only through OAuth
+        // OrganizationPrincipals are usually only through OAuth
         // They have access to a single organization
 
         Map<UUID, String> organizationSet = HashBiMap.create();

http://git-wip-us.apache.org/repos/asf/usergrid/blob/54276318/stack/services/src/main/java/org/apache/usergrid/security/shiro/principals/PrincipalIdentifier.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/security/shiro/principals/PrincipalIdentifier.java b/stack/services/src/main/java/org/apache/usergrid/security/shiro/principals/PrincipalIdentifier.java
index eb89d1e..b3df022 100644
--- a/stack/services/src/main/java/org/apache/usergrid/security/shiro/principals/PrincipalIdentifier.java
+++ b/stack/services/src/main/java/org/apache/usergrid/security/shiro/principals/PrincipalIdentifier.java
@@ -72,6 +72,9 @@ public abstract class PrincipalIdentifier {
         this.accessTokenCredentials = accessTokenCredentials;
     }
 
+    /** Return application UUID or null if none is associated with this prinicipal */
+
+    public abstract UUID getApplicationId();
 
     public abstract void grant(
         UsergridAuthorizationInfo info,

http://git-wip-us.apache.org/repos/asf/usergrid/blob/54276318/stack/services/src/main/resources/usergrid-services-context.xml
----------------------------------------------------------------------
diff --git a/stack/services/src/main/resources/usergrid-services-context.xml b/stack/services/src/main/resources/usergrid-services-context.xml
index 7e51d32..a3c353f 100644
--- a/stack/services/src/main/resources/usergrid-services-context.xml
+++ b/stack/services/src/main/resources/usergrid-services-context.xml
@@ -34,7 +34,7 @@
     <!--
     <bean id="cacheManager" class="org.apache.shiro.cache.MemoryConstrainedCacheManager"/>
     -->
-    <bean id="cacheManager" class="org.apache.usergrid.rest.security.shiro.ShiroCacheManager">
+    <bean id="cacheManager" class="org.apache.usergrid.security.shiro.ShiroCacheManager">
         <property name="properties" ref="properties" />
     </bean>
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/54276318/stack/services/src/test/java/org/apache/usergrid/management/RoleIT.java
----------------------------------------------------------------------
diff --git a/stack/services/src/test/java/org/apache/usergrid/management/RoleIT.java b/stack/services/src/test/java/org/apache/usergrid/management/RoleIT.java
index 783e67c..e2a1941 100644
--- a/stack/services/src/test/java/org/apache/usergrid/management/RoleIT.java
+++ b/stack/services/src/test/java/org/apache/usergrid/management/RoleIT.java
@@ -58,8 +58,7 @@ public class RoleIT {
     public void testRoleInactivity() throws Exception {
 
         OrganizationOwnerInfo ooi = setup.getMgmtSvc()
-                                         .createOwnerAndOrganization( "RoleIT", "edanuff5", "Ed Anuff", "ed@anuff.com5",
-                                                 "test", true, false );
+            .createOwnerAndOrganization( "RoleIT", "edanuff5", "Ed Anuff", "ed@anuff.com5", "test", true, false );
 
         OrganizationInfo organization = ooi.getOrganization();
 
@@ -74,7 +73,7 @@ public class RoleIT {
         properties.put( "activated", true );
         User user = em.create( User.ENTITY_TYPE, User.class, properties );
 
-        em.createRole( "logged-in", "Logged In", 1000 );
+        em.createRole( "logged-in", "Logged In", 2000 );
         setup.getEntityIndex().refresh(em.getApplicationId());
         em.addUserToRole( user.getUuid(), "logged-in" );
 
@@ -92,7 +91,7 @@ public class RoleIT {
 
         LOG.info( "Has role \"logged-in\"" );
 
-        Thread.sleep( 1000 );
+        Thread.sleep( 2100 );
 
         subject.login( token );
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/54276318/stack/services/src/test/resources/usergrid-custom-test.properties
----------------------------------------------------------------------
diff --git a/stack/services/src/test/resources/usergrid-custom-test.properties b/stack/services/src/test/resources/usergrid-custom-test.properties
index 5a20871..1c3d190 100644
--- a/stack/services/src/test/resources/usergrid-custom-test.properties
+++ b/stack/services/src/test/resources/usergrid-custom-test.properties
@@ -39,3 +39,6 @@ usergrid.use.default.queue=true
 
 # This property is required to be set and cannot be defaulted anywhere
 usergrid.cluster_name=usergrid
+
+# specified in seconds
+usergrid.auth.cache.time-to-live=1