若要在应用程序的实例之间保留令牌缓存,需要自定义序列化逻辑。 令牌缓存序列化所涉及的Java类和接口如下:
- ITokenCache:表示安全令牌缓存的接口。
-
ITokenCacheAccessAspect :表示在访问前后执行代码的操作的接口。 你需要为
@OverridebeforeCacheAccess 和 afterCacheAccess 实现负责序列化和反序列化缓存的逻辑。 - ITokenCacheAccessContext :表示访问令牌缓存的上下文的接口。
下面是令牌缓存的自定义序列化的天真实现。
Warning
由于下面的示例代码不展示完整的缓存存储生命周期,因此强烈建议不要将它复制并粘贴到生产环境中。 确保了解令牌缓存的安全性和访问要求。
static class TokenPersistence implements ITokenCacheAccessAspect {
String data;
TokenPersistence(String data) {
this.data = data;
}
@Override
public void beforeCacheAccess(ITokenCacheAccessContext iTokenCacheAccessContext) {
iTokenCacheAccessContext.tokenCache().deserialize(data);
}
@Override
public void afterCacheAccess(ITokenCacheAccessContext iTokenCacheAccessContext) {
data = iTokenCacheAccessContext.tokenCache().serialize();
}
// Loads cache from file
String dataToInitCache = readResource(this.getClass(), "/cache_data/serialized_cache.json");
ITokenCacheAccessAspect persistenceAspect = new TokenPersistence(dataToInitCache);
// By setting *TokenPersistence* on the PublicClientApplication, MSAL will call *beforeCacheAccess()* before accessing the cache and *afterCacheAccess()* after accessing the cache.
PublicClientApplication app =
PublicClientApplication.builder("my_client_id").setTokenCacheAccessAspect(persistenceAspect).build();