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实现以及所有AuthenticatingRealmAuthorizingRealm实现均实现 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

MemoryConstrainedCacheManagerCacheManager实现,适用于单 JVM 生产环境。它不是集群/分布式的,因此如果您的应用程序跨越一个以上的 JVM(例如在多个 Web 服务器上运行的 Web 应用程序),并且您希望跨 JVM 访问缓存条目,则将需要使用分布式缓存实现。

MemoryConstrainedCacheManagerManagementMapCache个实例,每个命名的缓存一个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 检查将获取新数据)。