keycloak~jwks-rsa中使用的設計模式

com.auth0.jwk組織下面的jwks-rsa包,主要實現的是通過公鑰對jwt的簽名進行驗證,在這個包中,它使用了包裝器的設計模式,對默認的jwks提供者添加了一緩存的支持,通過建立一個GuavaCachedJwkProvider類,傳入一個默認的UrlJwkProvider來將這個Provider進行包裝,讓它具有緩存的能力!

包裝器模式

包裝器模式(Wrapper Pattern)是一種結構型設計模式,它允許在不改變原始對象接口的情況下,動態地向對象添加新的功能。包裝器模式通過創建一個包裝類,將原始對象作爲包裝類的成員,並在包裝類中定義額外的行爲或功能來擴展原始對象的功能。

以下是包裝器模式的一些關鍵角色和特點:

  • Component(組件):定義了被包裝對象的接口,可以是一個抽象類或接口。

  • ConcreteComponent(具體組件):實現了Component接口,是被包裝的原始對象。

  • Wrapper(包裝器):也稱爲Decorator,持有一個指向Component的引用,並實現了與Component相同的接口。在包裝器中可以添加額外的功能,以增強原始對象的行爲。

包裝器模式的優點包括:

  1. 靈活性:可以動態地爲對象添加新的功能,而無需修改原始對象的代碼。
  2. 遵循開閉原則:可以在不修改現有代碼的情況下擴展對象的功能。
  3. 簡化代碼:將功能分散到多個小類中,避免了單個類變得龐大複雜。

總的來說,包裝器模式可以幫助我們在運行時動態地爲對象添加新的功能,同時保持代碼的靈活性和可維護性。常見的應用場景包括日誌記錄、緩存、加密等功能的動態添加。

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);
	}

程序員的修養,多看好的開源框架,多思考與總結。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章