Hi Andrew,
I've verified that the Cache is being called properly in the debugger
and that authorization data is being cached properly.
Here is my test configuration (the trunk/samples/web web.xml, slightly
modified). Remember, the order in which the configuration elements
are defined matters - they translate to method calls, which internally
alter state. There is an ordering bug - see the config comments
below:
<filter>
<filter-name>ShiroFilter</filter-name>
<filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
<init-param>
<param-name>config</param-name>
<param-value>
[main]
securityManager.sessionMode = native
# Ordering bug - these 2 lines _must_ be defined before
# defining the CacheManager and setting it on the
securityManager (below):
sessionDAO = org.apache.shiro.session.mgt.eis.MemorySessionDAO
securityManager.sessionDAO = $sessionDAO
cacheManager = test.TestCacheManager
securityManager.cacheManager = $cacheManager
demoRealm = org.apache.shiro.realm.text.PropertiesRealm
securityManager.realm = $demoRealm
[filters]
authc.loginUrl = /login.jsp
[urls]
# The /login.jsp is not restricted to authenticated
users (otherwise no one could log in!), but
# the 'authc' filter must still be specified for it so
it can process that url's
# login submissions. It is 'smart' enough to allow
those requests through as specified by the
# shiro.loginUrl above.
/login.jsp = authc
/account/** = authc
/remoting/** = authc, roles[b2bClient],
perms["remote:invoke:lan,wan"]
</param-value>
</init-param>
</filter>
And here is my test.TestCacheManager implementation:
public class TestCacheManager implements CacheManager {
Map<String, Cache> caches = new ConcurrentHashMap<String, Cache>();
public Cache getCache(String name) throws CacheException {
if (name == null) {
throw new NullPointerException("name");
}
Cache cache = caches.get(name);
if (cache == null) {
//MapCache with ConcurrentHashMap for testing only
//this would cause OutOfMemoryExceptions in a real app since it
//would never proactively release instances. Use a
SoftHashMap in production
//environments, or better yet, a CacheManager
implementation supported
//by an enterprise Cache product (TerraCotta, Coherence,
GigaSpaces, etc).
cache = new MapCache(name, new ConcurrentHashMap());
caches.put(name, cache);
}
return cache;
}
}
Regards,
Les
On Tue, Sep 15, 2009 at 9:44 AM, Les Hazlewood <[email protected]> wrote:
> On Mon, Sep 14, 2009 at 4:15 PM, Andy Tripp <[email protected]> wrote:
>
>> Cache's get() and put() methods are never called, and I can try tracking
>> down the problem, but I can't figure out what class should be making
>> these
>> calls.
>
> These would be done by the Realm instance, via the superclass
> AuthorizingRealm implementation - specifically in the
> 'getAuthorizationInfo' method. This method checks the cache, and if
> not found in the cache, then delegates to the 'doGetAuthorizationInfo'
> method which is implemented by subclasses.
>
> I hope that helps - I'll keep debugging from my end...
>