keycloak~jwks-rsa中使用的设计模式
com.auth0.jwk组织下面的jwks-rsa包,主要实现的是通过公钥对jwt的签名进行验证,在这个包中,它使用了包装器
的设计模式,对默认的jwks提供者添加了一缓存的支持,通过建立一个GuavaCachedJwkProvider
类,传入一个默认的UrlJwkProvider
来将这个Provider进行包装,让它具有缓存的能力!
包装器模式
包装器模式(Wrapper Pattern)是一种结构型设计模式,它允许在不改变原始对象接口的情况下,动态地向对象添加新的功能。包装器模式通过创建一个包装类,将原始对象作为包装类的成员,并在包装类中定义额外的行为或功能来扩展原始对象的功能。
以下是包装器模式的一些关键角色和特点:
-
Component(组件):定义了被包装对象的接口,可以是一个抽象类或接口。
-
ConcreteComponent(具体组件):实现了Component接口,是被包装的原始对象。
-
Wrapper(包装器):也称为Decorator,持有一个指向Component的引用,并实现了与Component相同的接口。在包装器中可以添加额外的功能,以增强原始对象的行为。
包装器模式的优点包括:
- 灵活性:可以动态地为对象添加新的功能,而无需修改原始对象的代码。
- 遵循开闭原则:可以在不修改现有代码的情况下扩展对象的功能。
- 简化代码:将功能分散到多个小类中,避免了单个类变得庞大复杂。
总的来说,包装器模式可以帮助我们在运行时动态地为对象添加新的功能,同时保持代码的灵活性和可维护性。常见的应用场景包括日志记录、缓存、加密等功能的动态添加。
jwks-rsa中的体现
- 组件 JwkProvider
- 具体组件 UrlJwkProvider
- 包装器
- GuavaCachedJwkProvider 缓存能力
- RateLimitedJwkProvider 限流能力
我们为UrlJwkProvider进行缓存的包装
/**
* 缓存包装器.
* @throws MalformedURLException
* @throws JwkException
*/
@Test
public void jwkReadCacheWrapper() throws MalformedURLException, JwkException {
UrlJwkProvider jwkProvider = new UrlJwkProvider(new URL(jwksUrl));
JwkProvider cachedJwkProvider = new GuavaCachedJwkProvider(jwkProvider);
Jwk jwk = cachedJwkProvider.get("certsId");
Algorithm algorithm = Algorithm.RSA256((RSAPublicKey) jwk.getPublicKey(), null);
DecodedJWT jwt = JWT.decode(token);
// check JWT is valid
algorithm.verify(jwt);
}
程序员的修养,多看好的开源框架,多思考与总结。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2023-04-23 springboot~关于md5签名引发的问题
2018-04-23 java~日期与字符串的转化
2014-04-23 MVVM架构~前台后台分离的思想与实践
2012-04-23 架构,改善程序复用性的设计(目录)