On this page
Caching
Shiro 开发团队知道性能对于许多应用程序至关重要。从第一天开始,缓存是 Shiro 内置的一流功能,可确保安全操作保持尽可能快的速度。
但是,虽然缓存是 Shiro 的基本组成部分,但实现完整的缓存机制将超出安全框架的核心能力。为此,Shiro 的缓存支持基本上是一种抽象(包装器)API,它将``坐在''底层生产缓存机制(例如 Hazelcast,Ehcache,OSCache,Terracotta,Coherence,GigaSpaces,JBossCache 等)之上。这允许 Shiro 最终用户配置他们喜欢的任何缓存机制。
Caching API
Shiro 具有三个重要的缓存接口:
CacheManager-所有缓存的主要 Manager 组件,它返回
Cache
个实例。Cache-维护键/值对
CacheManagerAware-由希望接收和使用 CacheManager 实例的组件实现
CacheManager
返回Cache
实例,各种 Shiro 组件根据需要使用这些Cache
实例来缓存数据。任何四郎
实现CacheManagerAware
的组件将自动接收已配置的CacheManager
,可在其中使用它来获取Cache
实例。
Shiro SecurityManager实现以及所有AuthenticatingRealm和AuthorizingRealm实现均实现 CacheManagerAware。如果在SecurityManager
上设置CacheManager
,它将依次在实现 CacheManagerAware(OO 委托)的各个领域上进行设置。例如,在 shiro.ini 中:
示例 shiro.ini CacheManager 配置
securityManager.realms = $myRealm1, $myRealm2, ..., $myRealmN
...
cacheManager = my.implementation.of.CacheManager
...
securityManager.cacheManager = $cacheManager
# at this point, the securityManager and all CacheManagerAware
# realms have been set with the cacheManager instance
CacheManager Implementations
Shiro 提供了许多现成的CacheManager
实现,您可能会发现它们有用,而不是自己实现。
MemoryConstrainedCacheManager
MemoryConstrainedCacheManager是CacheManager
实现,适用于单 JVM 生产环境。它不是集群/分布式的,因此如果您的应用程序跨越一个以上的 JVM(例如在多个 Web 服务器上运行的 Web 应用程序),并且您希望跨 JVM 访问缓存条目,则将需要使用分布式缓存实现。
MemoryConstrainedCacheManager
ManagementMapCache个实例,每个命名的缓存一个MapCache
实例。每个MapCache
实例都有一个 Shiro SoftHashMap支持,该 Shiro SoftHashMap可以根据应用程序的运行时内存限制/需求(通过利用 JDK SoftReference实例)自动调整自身大小。
由于MemoryConstrainedCacheManager
可以根据应用程序的内存配置文件自动调整自身大小,因此可以安全地在单 JVM 生产应用程序中使用以及满足测试需求。但是,它没有更高级的功能,例如缓存条目生存时间或生存时间设置。对于这些更高级的缓存 Management 功能,您可能希望使用以下更高级的CacheManager
产品之一。
MemoryConstrainedCacheManager shiro.ini 配置示例
...
cacheManager = org.apache.shiro.cache.MemoryConstrainedCacheManager
...
securityManager.cacheManager = $cacheManager
HazelcastCacheManager
TBD
EhCacheManager
TBD
授权缓存无效
最后请注意,AuthorizingRealm具有clearCachedAuthorizationInfo method,子类可以调用clearCachedAuthorizationInfo method来逐出特定帐户的缓存 authzInfo。如果相应帐户的 authz 数据已更改,则通常由自定义逻辑调用(以确保下一次 authz 检查将获取新数据)。