
本文档介绍了如何在 Spring Security OAuth2 资源服务器中缓存 Opaque Token Introspection 请求,以提高系统在认证服务器不稳定时的可用性和性能。通过自定义 OpaqueTokenIntrospector 并集成缓存机制,可以有效减少对认证服务器的依赖,避免频繁的 401 错误,提升用户体验。
在使用 Spring Boot 构建 OAuth2 资源服务器时,通常需要与认证服务器进行交互以验证 Opaque Token 的有效性。当认证服务器出现不稳定情况时,频繁的 Introspection 请求会导致资源服务器性能下降,并可能出现大量的 401 错误。为了解决这个问题,我们可以通过缓存 Introspection 请求的结果来减少对认证服务器的依赖。
自定义 OpaqueTokenIntrospector
Spring Security 提供了 OpaqueTokenIntrospector 接口,用于从认证服务器获取 Token 的元数据。我们可以通过自定义该接口的实现来集成缓存逻辑。
首先,在 Spring Security 配置中暴露一个 OpaqueTokenIntrospector 的 Bean:
@Bean
public OpaqueTokenIntrospector introspector() {
return new CustomOpaqueTokenIntrospector(this.introspectionUri, this.clientId, this.clientSecret);
}接下来,创建 CustomOpaqueTokenIntrospector 类,实现 OpaqueTokenIntrospector 接口,并在其中集成缓存逻辑。这里我们使用 org.ehcache 作为缓存的实现。
import org.springframework.security.oauth2.core.OAuth2AuthenticatedPrincipal;
import org.springframework.security.oauth2.server.resource.introspection.NimbusOpaqueTokenIntrospector;
import org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector;
import org.ehcache.Cache;
import org.ehcache.CacheManager;
import org.ehcache.config.builders.CacheConfigurationBuilder;
import org.ehcache.config.builders.CacheManagerBuilder;
import org.ehcache.config.builders.ResourcePoolsBuilder;
import org.ehcache.expiry.ExpiryPolicyBuilder;
import java.time.Duration;
import java.time.Instant;
public class CustomOpaqueTokenIntrospector implements OpaqueTokenIntrospector {
private final OpaqueTokenIntrospector introspector;
private final CacheManager cacheManager;
private final Cache<String, OAuth2AuthenticatedPrincipal> accessTokens;
public CustomOpaqueTokenIntrospector(String uri, String clientId, String clientSecret) {
cacheManager = CacheManagerBuilder.newCacheManagerBuilder().build(true);
accessTokens = cacheManager.createCache("iamCache",
CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, OAuth2AuthenticatedPrincipal.class,
ResourcePoolsBuilder.heap(1000))
.withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(1800))));
this.introspector = new NimbusOpaqueTokenIntrospector(uri, clientId, clientSecret);
}
@Override
public OAuth2AuthenticatedPrincipal introspect(String token) {
if (this.accessTokens.containsKey(token)) {
OAuth2AuthenticatedPrincipal cachedPrincipal = this.accessTokens.get(token);
if (cachedPrincipal.getAttribute("exp") != null
&& ((Instant) cachedPrincipal.getAttribute("exp"))
.isAfter(Instant.now())) {
return cachedPrincipal;
}
this.accessTokens.remove(token);
}
OAuth2AuthenticatedPrincipal principal = introspector.introspect(token);
this.accessTokens.put(token, principal);
return principal;
}
public Cache<String, OAuth2AuthenticatedPrincipal> getAccessTokensCacheFromCacheManager() {
return cacheManager.getCache("iamCache", String.class, OAuth2AuthenticatedPrincipal.class);
}
}代码解释
注意事项
总结
通过自定义 OpaqueTokenIntrospector 并集成缓存机制,可以有效减少对认证服务器的依赖,提高系统在认证服务器不稳定时的可用性和性能。在实际应用中,需要根据具体情况选择合适的缓存失效策略、缓存大小和异常处理机制,以保证系统的稳定性和可靠性。
以上就是Spring Security 中缓存 Introspect 请求的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号