升級 Keycloak
本指南說明如何升級 Keycloak。請依以下順序使用下列程序
-
檢閱先前 Keycloak 版本的遷移變更。
-
升級 Keycloak 伺服器。
-
升級 Keycloak 轉接器。
-
升級 Keycloak 管理用戶端。
遷移變更
遷移至 26.0.0
Infinispan 編列變更
編列是將 Java 物件轉換成位元組,以在 Keycloak 伺服器之間透過網路傳送它們的程序。在 Keycloak 26 中,編列程式庫已從 JBoss 編列變更為 Infinispan Protostream。這些程式庫彼此不相容,而且需要一些步驟來確保工作階段資料不會遺失。
JBoss 編列和 Infinispan Protostream 彼此不相容,不正確的使用方式可能會導致資料遺失。因此,升級至此版本時,會清除所有快取。 |
為了防止遺失使用者工作階段,請先升級至 Keycloak 25,然後啟用 Keycloak 25 的遷移指南中概述的永久工作階段功能。
運算子不再預設為 proxy=passthrough
運算子不再預設為 proxy=passthrough 的主機名稱 v1 設定。這允許使用主機名稱 v2 的部署,以在沒有其他選項的情況下,按照預期方式運作的固定邊緣主機名稱。
ClusterProvider
API 中的新方法
下列方法已新增至 org.keycloak.cluster.ClusterProvider
-
void notify(String taskKey, Collection<? extends ClusterEvent> events, boolean ignoreSender, DCNotify dcNotify)
當多個事件傳送至相同的 taskKey
時,這個方法會批次處理事件,並僅執行單一網路呼叫。這是一個最佳化方法,可減少流量和與網路相關的資源。
在 Keycloak 26 中,新的方法具有預設實作,以保持與自訂實作的向後相容性。預設實作會對每個事件執行單一網路呼叫,而且它將在未來版本的 Keycloak 中移除。
移除網域時不再觸發群組相關事件
為了提高群組的延展性,現在移除網域時會直接從資料庫中移除它們。因此,當移除網域時,不再觸發群組相關事件,例如 GroupRemovedEvent
。
如果您有延伸模組在移除網域時處理任何群組相關事件,請務必改為使用 RealmRemovedEvent
,以在移除網域及其群組時執行任何清除或自訂處理。
GroupProvider
介面也會更新為新的 preRemove(RealmModel)
方法,以強制實作在移除網域時正確處理群組的移除。
從根目錄自動重新導向至相對路徑
指定 http-relative-path
屬性時,使用者會自動重新導向至 Keycloak 主機的路徑。這表示當相對路徑設定為 /auth
,且使用者存取 localhost:8080/
時,頁面會重新導向至 localhost:8080/auth
。
當指定 http-management-relative-path
或 http-relative-path
屬性時,管理介面也會套用相同的情況。
這可改善使用者體驗,因為使用者不再需要將相對路徑明確設定為 URL。
運算子排程預設值
現在 Keycloak Pod 將具有預設關聯性,以防止來自相同 CR 的多個執行個體部署在相同的節點上,且來自相同 CR 的所有 Pod 將優先位於相同的區域中,以防止延伸快取叢集。
運算子的預設 CPU 和記憶體限制/要求
為了遵循最佳做法,已導入運算子的預設 CPU 和記憶體限制/要求。它會影響非 OLM 和 OLM 安裝。若要覆寫 OLM 安裝的預設值,請編輯運算子的訂閱中的 resources
區段。
keycloak-common
模組中的過時
下列項目已過時,將在即將推出的 Keycloak 版本中移除,且沒有替代項目
-
org.keycloak.common.util.reflections.Reflections.newInstance(java.lang.Class<T>)
-
org.keycloak.common.util.reflections.Reflections.newInstance(java.lang.Class<?>, java.lang.String)
-
org.keycloak.common.util.reflections.SetAccessiblePrivilegedAction
-
org.keycloak.common.util.reflections.UnSetAccessiblePrivilegedAction
對 URL 編碼一致使用 UTF-8 字元集
org.keycloak.common.util.Encode
現在始終對 URL 編碼使用 UTF-8
字元集,而不是隱含地依賴 file.encoding
系統屬性。
設定 LDAP 連線集區
在此版本中,LDAP 連線集區設定僅依賴系統屬性。主要原因是 LDAP 連線集區設定是 JVM 層級設定,而不是特定於個別網域或 LDAP 提供者執行個體。
與先前的版本相比,任何與 LDAP 連接池相關的 realm 配置都將被忽略。如果您是從先前的版本遷移,並且在您的 LDAP 提供者中設定了以下任何設定,請考慮改用系統屬性。
-
connectionPoolingAuthentication
-
connectionPoolingInitSize
-
connectionPoolingMaxSize
-
connectionPoolingPrefSize
-
connectionPoolingTimeout
-
connectionPoolingProtocol
-
connectionPoolingDebug
如需更多詳細資訊,請參閱設定連線池。
登入主題中的自訂頁尾
此版本引入了為 base/login
和 keycloak.v2/login
主題的登入頁面輕鬆新增自訂頁尾的功能。為了使用自訂頁尾,請在您的自訂登入主題中建立一個包含所需內容的 footer.ftl
檔案。
如需更多詳細資訊,請參閱將自訂頁尾新增至登入主題。
在重新啟動後持續保存撤銷的存取權杖
在此版本中,預設情況下,當使用嵌入式快取時,撤銷的存取權杖會寫入資料庫,並在叢集重新啟動時重新載入。
若要停用此行為,請使用 所有提供者設定 指南中概述的 SPI 選項 spi-single-use-object-infinispan-persist-revoked-tokens
。
SingleUseObjectProvider
的 SPI 行為已變更,對於撤銷的權杖,僅必須使用 put
和 contains
方法。這是預設強制執行的,可以使用 SPI 選項 spi-single-use-object-infinispan-persist-revoked-tokens
來停用。
高可用性多站點部署
Keycloak 26 對建議的 HA 多站點架構進行了重大改進,最值得注意的是:
-
Keycloak 部署現在能夠在兩個站點同時處理使用者請求。先前一次僅在一個站點處理請求的負載平衡器設定將繼續運作。
-
現在需要主動監控站點之間的連線,以便在發生故障時進行站點之間的複寫。藍圖描述了使用 Alertmanager 和 AWS Lambda 的設定。
-
負載平衡器藍圖已更新為使用 AWS Global Accelerator,因為這避免了客戶端 DNS 快取導致的長時間故障轉移。
-
現在架構要求持久的使用者會話。因此,使用者會話將保留在 Keycloak 或 Infinispan 升級中。
-
外部 Infinispan 請求處理已得到改進,以減少記憶體使用量和請求延遲。
由於上述變更,您現有的 Keycloak 部署需要進行以下變更。
-
當啟用
multi-site
功能時,快取設定檔提供的distributed-cache
定義將被忽略,因此您必須通過藍圖中概述的cache-remote-*
命令列引數或 Keycloak CR 來設定與外部 Infinispan 部署的連線。所有remote-store
設定都必須從快取設定檔中移除。 -
檢閱您目前在外部 Infinispan 中的快取設定,並使用 Keycloak 最新版本文件中概述的設定來更新它們。雖然先前版本的快取設定僅在站點之間的備份複寫失敗時記錄警告,但新的設定可確保兩個站點中的狀態保持同步:當兩個站點之間的傳輸失敗時,呼叫者將看到錯誤。因此,您需要設定監控,以便在站點發生故障時斷開兩個站點的連線。Keycloak 高可用性指南包含有關如何設定的藍圖。
-
雖然先前的負載平衡器設定將繼續與 Keycloak 一起運作,但請考慮升級現有的 Route53 設定,以避免因用戶端 DNS 快取而導致長時間的故障轉移。
-
如果您已使用 remote-store 設定更新了快取設定 XML 檔案,這些設定將不再運作。請改為啟用
multi-site
功能,並使用cache-remove-*
選項。
單站點設定中的外部 Infinispan
如果您在單站點設定中使用外部 Infinispan,則先前的 Keycloak 版本不支援此功能,Keycloak 26 也不支援此功能。為了保護使用者避免意外地透過 Keycloak 快取 XML 中的手動設定或透過 CLI 選項來使用它,現在會使用功能標誌 cache-embedded-remote-store
來保護它。它被標記為實驗性功能,因此不受支援。除非啟用此實驗性功能,否則 Keycloak 26 不會以這種設定啟動,而是會顯示錯誤。
如果您一直使用外部 Infinispan 來保持使用者在重新啟動和升級之間登入,請改用預設啟用的 persistent-user-sessions
功能。然後不再需要外部 Infinispan。
實驗性功能 cache-embedded-remote-store
將在未來的次要版本中移除。
管理員引導和復原
當所有管理員使用者都被鎖定時,以前很難重新取得 Keycloak 執行個體的存取權。此過程需要多個進階步驟,包括直接資料庫存取和手動變更。為了改善使用者體驗,Keycloak 現在提供了多種引導新管理員帳戶的方式,這些方式可用於從此類情況中復原。
因此,環境變數 KEYCLOAK_ADMIN
和 KEYCLOAK_ADMIN_PASSWORD
已被棄用。您應該改用 KC_BOOTSTRAP_ADMIN_USERNAME
和 KC_BOOTSTRAP_ADMIN_PASSWORD
。這些也是一般選項,因此可以透過 cli 或其他配置來源指定,例如 --bootstrap-admin-username=admin
。如需更多資訊,請參閱新的 引導管理員和復原 指南。
應用程式啟動的必要操作重新導向現在包含 kc_action 參數
現在,當從應用程式啟動的必要操作執行重新導向時,必要操作提供者名稱會透過 kc_action
參數傳回。這有助於偵測為客戶端執行了哪個必要操作。執行的結果可以透過 kc_action_status
參數確定。
注意:此功能需要變更 Keycloak JS 配接器,因此建議您升級到最新版本的配接器,如果您想要使用此功能。
keycloak-services
模組中的棄用
UserSessionCrossDCManager
類別已被棄用,並計劃在 Keycloak 的未來版本中移除。請閱讀 UserSessionCrossDCManager
Javadoc 以取得要使用的替代方法。
身分提供者不再可從 realm 表示法取得
作為改善 realm 和組織在擁有許多身分提供者時的可擴展性的一部分,realm 表示法不再保留身分提供者的清單。但是,在匯出 realm 時,它們仍然可以從 realm 表示法中取得。
若要取得查詢 realm 中的身分提供者,請優先使用 /realms/{realm}/identity-provider/instances
端點。此端點支援篩選器和分頁。
CLI 匯入預留位置替換
CLI 命令 kc.[sh|bat] import
現在已啟用預留位置替換。先前預留位置替換僅在啟動時為 realm 匯入啟用。
如果您希望停用 import
命令的預留位置替換,請新增系統屬性 -Dkeycloak.migration.replace-placeholders=false
依名稱搜尋 realm 的新 Java API
RealmProvider
Java API 現在包含一個新的方法 Stream<RealmModel> getRealmsStream(String search)
,它允許依名稱搜尋 realm。雖然有一個預設的實作在從提供者載入後篩選串流,但鼓勵實作提供更有效率的實作。
金鑰儲存區和信任儲存區的預設格式變更
Keycloak 現在根據副檔名來決定金鑰儲存區和信任儲存區的格式。如果副檔名是 .p12
、.pkcs12
或 .pfx
,則格式為 PKCS12。如果副檔名是 .jks
、.keystore
或 .truststore
,則格式為 JKS。如果副檔名是 .pem
、.crt
或 .key
,則格式為 PEM。
您仍然可以明確指定 https-key-store-type
和 https-trust-store-type
來覆寫自動偵測。這也適用於管理介面及其 https-management-key-store-type
。FIPS 嚴格模式的限制保持不變。
spi-truststore-file-* 選項和信任儲存區相關選項 https-trust-store-* 已被棄用,我們強烈建議使用系統信任儲存區。如需更多詳細資訊,請參閱相關的 指南。 |
改善選擇身分提供者的效能
已將新的索引新增至 IDENTITY_PROVIDER
資料表,以改善擷取與組織相關聯的 IDP 的查詢效能,並擷取可用於登入的 IDP(已啟用、不是 link_only
、未標記為 hide_on_login
的 IDP)。
如果資料表目前包含超過 300,000 個條目,Keycloak 預設會在自動架構遷移期間跳過建立索引,而是在遷移期間將 SQL 陳述式記錄在主控台上。在這種情況下,必須在 Keycloak 啟動後在資料庫中手動執行陳述式。
此外,kc.org
和 hideOnLoginPage
設定屬性已遷移到身分提供者本身,以便在搜尋提供者時允許更有效率的查詢。因此,API 用戶端應使用 IdentityProviderRepresentation
中的 getOrganizationId/setOrganizationId
和 isHideOnLogin/setHideOnLogin
方法,並避免使用現在已被棄用的舊版設定屬性來設定這些屬性。
移除 GELF 記錄處理常式
GELF 支援已棄用一段時間,在此版本中,它最終已從 Keycloak 中移除。其他記錄處理常式可用且完全支援用來替代 GELF,例如 Syslog。如需詳細資訊,請參閱 記錄指南。
common
主題資源的路徑已變更
keycloak
主題的 common
資源的一些路徑已變更,特別是協力廠商程式庫的資源。請務必據此更新您的自訂主題
-
node_modules/patternfly/dist
現在是vendor/patternfly-v3
-
node_modules/@patternfly/patternfly
現在是vendor/patternfly-v4
-
node_modules/@patternfly-v5/patternfly
現在是vendor/patternfly-v5
-
node_modules/rfc4648/lib
現在是vendor/rfc4648
此外,以下資源已從 common
主題中移除
-
node_modules/alpinejs
-
node_modules/jquery
如果您先前在您的主題中使用任何已移除的資源,請務必將它們新增到您自己的主題資源中。
額外的資料來源現在需要使用 XA
Keycloak 預設不使用 XA 資料來源。但是,如果使用多個資料來源,這被認為是不安全的。從此版本開始,如果您要向 Keycloak 新增額外的資料來源,則需要使用 XA 資料來源。如果預設資料來源支援 XA,您可以使用設定 --transaction-xa-enabled=true
選項來達成。對於額外的資料來源,您需要在您的 quarkus.properties
檔案中使用 quarkus.datasource.<您的資料來源名稱>.jdbc.transactions=xa
選項。最多只能有一個資料來源是非 XA。當您沒有交易儲存的持久性儲存時,不支援復原。
已移除主機名稱 v1 功能
已移除已棄用的主機名稱 v1 功能。此功能已在 Keycloak 25 中棄用,並由主機名稱 v2 取代。如果您仍在使用此功能,則必須遷移到主機名稱 v2。有關詳細資訊,請參閱設定主機名稱 (v2) 和 初始遷移指南。
已移除 Proxy 選項
已移除已棄用的 proxy
選項。此選項已在 Keycloak 24 中棄用,並由 proxy-headers
選項與需要時的主機名稱選項組合取代。有關詳細資訊,請參閱使用反向 Proxy 和 初始升級指南。
預設會持久保存所有使用者會期
由於資料庫現在是使用者會期的真實來源,因此可以限制會期快取的大小以減少記憶體使用量。如果您使用預設的 conf/cache-ispn.xml
檔案,用於儲存使用者和用戶端會期的快取預設設定為僅儲存 10000 個會期和每個條目的一個擁有者。
使用與下方所示類似的組態來更新您的自訂嵌入式 Infinispan 快取組態檔案,適用於快取 sessions
、clientSessions
、offlineSessions
和 offlineClientSessions
<distributed-cache name="sessions" owners="1"> <!-- other configuration --> <memory max-count="10000"/> </distributed-cache>
有關詳細資訊,請繼續閱讀設定分散式快取指南。
啟用持久性會期時,已移除閒置會期的寬限期
先前版本的 Keycloak 為使用者和用戶端會期的閒置時間增加兩分鐘的寬限期。這是由於先前的架構在叢集中非同步複製會期重新整理時間。使用持久性使用者會期,這不再必要,因此現在已移除寬限期。
要保留舊的行為,請更新您的領域組態並將會期和用戶端閒置時間延長兩分鐘。
已移除對舊版 redirect_uri
參數和 SPI 選項的支援
先前版本的 Keycloak 支援使用者自動登出並透過開啟登出端點 URL(例如 http(s)://example-host/auth/realms/my-realm-name/protocol/openid-connect/logout?redirect_uri=encodedRedirectUri
)重新導向至應用程式。此功能已在 Keycloak 18 中棄用,並在此版本中移除,以支援遵循 OpenID Connect 規格。
作為此變更的一部分,以下相關的 SPI 組態選項已被移除
-
--spi-login-protocol-openid-connect-legacy-logout-redirect-uri
-
--spi-login-protocol-openid-connect-suppress-logout-confirmation-screen
如果您仍然使用這些選項或用於登出的 redirect_uri
參數,則應改為實作OpenID Connect RP 起始登出規格。
針對 --optimized
啟動選項的額外驗證
現在,--optimized
啟動選項要求必須先建置最佳化伺服器映像。這可以透過先執行 kc.sh|bat build
或任何其他不含 --optimized
旗標的伺服器命令(例如 start
、export
、import
)來達成。
已移除配接器和雜項 BOM 檔案
已移除 org.keycloak.bom:keycloak-adapter-bom
和 org.keycloak.bom:keycloak-misc-bom
BOM 檔案。配接器 BOM 已不再有用,因為大多數 Java 配接器已移除。雜項 BOM 僅包含一個成品,keycloak-test-helper
,並且該成品也在此版本中移除。
已移除 keycloak-test-helper
此版本已移除 Maven 成品 org.keycloak:keycloak-test-helper
。該成品提供了幾個用於處理 Java 管理用戶端的輔助方法。如果您使用輔助方法,可以根據需要在您的應用程式中分支它們。
憑證的新通用事件類型
現在有更新 (UPDATE_CREDENTIAL
) 和移除 (REMOVE_CREDENTIAL
) 憑證的通用事件。憑證類型在事件的 credential_type
屬性中描述。電子郵件事件接聽器支援新的事件類型。
以下事件類型現在已棄用,並將在未來的版本中移除:UPDATE_PASSWORD
、UPDATE_PASSWORD_ERROR
、UPDATE_TOTP
、UPDATE_TOTP_ERROR
、REMOVE_TOTP
、REMOVE_TOTP_ERROR
--import-realm
選項可以匯入主領域
當在主領域存在之前使用 --import-realm
選項執行 start
或 start-dev
命令時,如果匯入材料中存在主領域,則會匯入該主領域。先前的行為是先建立主領域,然後略過其匯入。
已更新 BouncyCastle FIPS
現在使用 BouncyCastle FIPS 程式庫的第 2 版測試並支援我們的 FIPS 140-2 整合。此版本已通過 Java 21 認證。如果您使用 FIPS 140-2 整合,建議您將 BouncyCastle FIPS 程式庫升級到最新文件中提到的版本。
BouncyCastle FIPS 第 2 版已通過 FIPS 140-3 認證。因此,只要在符合 FIPS 140-3 標準的系統上使用 Keycloak,Keycloak 就可以符合 FIPS 140-3 標準。這可能是基於 RHEL 9 的系統,其本身符合 FIPS 140-3 標準。但請注意,基於 RHEL 8 的系統僅通過 FIPS 140-2 認證。
已從 JavaScript 管理用戶端移除 setOrCreateChild()
方法
已從基於 JavaScript 的管理用戶端中移除 groups.setOrCreateChild()
方法。如果您仍然使用此方法,請改為使用 createChildGroup()
或 updateChildGroup()
方法。
Keycloak JS
此版本包括 Keycloak JS 程式庫的幾項變更,應予以考量。這些變更的主要動機是將程式庫與 Keycloak 伺服器分離,以便可以獨立重構程式庫,簡化程式碼並使其更容易在未來維護。變更如下
程式庫不再從伺服器靜態提供
Keycloak JS 程式庫不再從 Keycloak 伺服器靜態提供。這表示下列 URL 不再可用
-
/js/keycloak-authz.js
-
/js/keycloak-authz.min.js
-
/js/keycloak.js
-
/js/keycloak.min.js
-
/js/{version}/keycloak-authz.js
-
/js/{version}/keycloak-authz.min.js
-
/js/{version}/keycloak.js
-
/js/{version}/keycloak.min.js
此外,已從管理主控台主題中移除連結至這些 URL 上程式庫的 keycloakJsUrl
屬性。如果您的自訂主題使用此屬性來包含程式庫,您應更新您的主題以使用其他方法包含程式庫。
如果您還沒有這麼做,您應使用套件管理器(例如 NPM)在您的專案中包含程式庫。該程式庫在 NPM 註冊表中以 keycloak-js
提供。您可以使用以下命令安裝它
npm install keycloak-js
或者,伺服器的發行版本包含 keycloak-js-26.0.0.tgz
封存中的程式庫副本。您可以從該處將程式庫複製到您的專案中。如果您在瀏覽器中直接使用程式庫而不進行建置,則需要自行託管該程式庫。套件管理器仍然是在您的專案中包含程式庫的建議方式,因為它將使未來更容易更新程式庫。
已移除對 UMD 發行版本的支援
已移除 Keycloak JS 程式庫的 UMD 發行版本 通用模組定義。這表示程式庫不再公開為全域變數,而必須匯入為 模組。此變更符合現代 JavaScript 開發實務,並允許瀏覽器和建置工具之間更一致的體驗,並且通常會產生更可預測的程式碼,且副作用更少。
如果您使用像 Vite 或 Webpack 這樣的捆綁器,則不會有任何改變,您將擁有與之前相同的體驗。如果您直接在瀏覽器中使用該程式庫,則需要更新您的程式碼以將該程式庫作為模組匯入
<!-- Before -->
<script src="/path/to/keycloak.js"></script>
<script>
const keycloak = new Keycloak();
</script>
<!-- After -->
<script type="module">
import Keycloak from '/path/to/keycloak.js';
const keycloak = new Keycloak();
</script>
您也可以選擇使用 import map 使程式庫的匯入不那麼冗長
<script type="importmap">
{
"imports": {
"keycloak-js": "/path/to/keycloak.js"
}
}
</script>
<script type="module">
// The library can now be imported without specifying the full path, providing a similar experience as with a bundler.
import Keycloak from 'keycloak-js';
const keycloak = new Keycloak();
</script>
如果您使用 TypeScript,則可能需要更新您的 tsconfig.json
才能解析程式庫
{
"compilerOptions": {
"moduleResolution": "Bundler"
}
}
現在需要 Keycloak
實例的組態
先前,可以在不傳遞任何組態的情況下建構 Keycloak
實例。然後,組態會根據包含的 keycloak.js
腳本的路徑,從伺服器上的 keycloak.json
檔案中自動載入。由於程式庫不再從伺服器靜態提供,因此此功能已被移除。現在,您在建構 Keycloak
實例時需要明確傳遞組態
// Before
const keycloak = new Keycloak();
// After
const keycloak = new Keycloak({
url: "http://keycloak-server",
realm: "my-realm",
clientId: "my-app"
});
// Alternatively, you can pass a URL to a `keycloak.json` file.
// Note this is not reccomended as it creates additional network requests, and is prone to change in the future.
const keycloak = new Keycloak('http://keycloak-server/path/to/keycloak.json');
現在登入方法是 async
Keycloak JS 現在使用 Web Crypto API 進行各種加密功能。由於此 API 的非同步性質,以下公開方法現在將始終傳回 Promise
-
login()
-
createLoginUrl()
-
createRegisterUrl()
請務必更新您的程式碼以 await
這些方法
// Before
keycloak.login();
const loginUrl = keycloak.createLoginUrl();
const registerUrl = keycloak.createRegisterUrl();
// After
await keycloak.login();
const loginUrl = await keycloak.createLoginUrl();
const registerUrl = await keycloak.createRegisterUrl();
請務必更新您的程式碼以 await
這些方法。
現在需要安全內容
Keycloak JS 現在需要 安全內容才能執行。原因是該程式庫現在使用 Web Crypto API 進行各種加密功能。此 API 僅在透過 HTTPS、localhost
或 .localhost
網域提供的安全內容中可用。如果您在不安全的內容中使用該程式庫,則需要更新您的開發環境以使用安全內容。
遷移至 25.0.2
改善刪除使用者同意的效能
當刪除客戶端範圍或整個領域時,也應該移除相關的使用者同意。已在 USER_CONSENT_CLIENT_SCOPE
表格上新增一個新的索引以提高效能。
請注意,如果表格包含超過 300,000 個項目,Keycloak 預設會跳過自動架構遷移期間索引的建立,而改為將 SQL 陳述式記錄到主控台。在 Keycloak 啟動後,必須在資料庫中手動執行這些陳述式。請參閱升級指南,以了解如何設定不同的限制。
遷移至 25.0.0
新的主機名稱選項
預設支援主機名稱 v2 選項,因為舊的主機名稱選項已棄用,並將在後續版本中移除。預設會啟用新的選項,因此 Keycloak 將無法識別舊的選項。
必要的遷移列表
舊選項 | 新選項 |
---|---|
|
|
|
|
|
|
如您所見,hostname
和 hostname-admin
選項已移除 *-url
後綴。hostname
選項接受主機名稱和網址,但 hostname-admin
現在只接受完整的網址。
此外,無法單獨設定 path
或 port
。您可以透過為 hostname
和 hostname-admin
選項提供完整的網址來實現。
如果埠號不是網址的一部分,則會從傳入的請求標頭動態解析。
除非 HTTPS 是 hostname
和 hostname-admin
網址的一部分,否則不再強制執行 HTTPS。如果未指定,使用的通訊協定 (http/https
) 會從傳入的請求動態解析。已移除 hostname-strict-https
選項。
已移除的選項 |
---|
|
|
|
|
|
|
為了使用舊的主機名稱選項,以便有更多時間進行遷移,請啟用 hostname:v1 功能,例如 features=hostname:v1 。請注意,只能啟用 hostname:v1 或 hostname:v2 ,不能同時啟用兩者。 |
範例
# Hostname v1
bin/kc.[sh|bat] start --hostname=mykeycloak.org --https-port=8543 --hostname-path=/auth --hostname-strict-https=true
# Hostname v2
bin/kc.[sh|bat] start --hostname=https://mykeycloak.org:8543/auth
如範例所示,現在可以透過單一 hostname
選項指定網址的所有部分,這簡化了主機名稱設定過程。請注意,HTTPS 不是由 hostname-strict-https
選項強制執行,而是透過在主機名稱網址中指定來強制執行。
# Hostname v1
bin/kc.[sh|bat] start --hostname=mykeycloak.org --hostname-strict-backchannel=true
# Hostname v2
bin/kc.[sh|bat] start --hostname=mykeycloak.org --hostname-backchannel-dynamic=false
請注意,如果要對後端和前端端點使用相同的網址,則行為會有所變更。先前在主機名稱 v1 中,回溯通道網址是從請求標頭動態解析。因此,為了達到所需結果,您必須指定 hostname-strict-backchannel=true
。
對於主機名稱 v2,回溯通道網址已與前端網址相同。為了從請求標頭動態解析,您需要設定 hostname-backchannel-dynamic=true
並為 hostname
選項提供完整的網址。
如需更多詳細資訊和更全面的情境,請參閱設定主機名稱 (v2)。
security-admin-console
用戶端重新導向 URI
在主機名稱 v1 中,${authAdminUrl}
的處理方式已變更。先前在主機名稱 v1 中,如果未設定 hostname-admin
或 hostname-admin-url
選項,則會從請求動態解析管理員網址。在主機名稱 v2 中,管理員網址預設為前端網址。如果設定了 hostname
選項且 hostname-strict
為 true,則此變更將會阻止使用根網址 ${authAdminUrl}
的用戶端使用替代主機名稱的重新導向 URI。您應該考慮使用 hostname-admin
選項而不是重新導向 URI,以允許單一替代主機名稱。應移除替代主機名稱重新導向,因為 security-admin-console
用戶端只需要預設的重新導向 URI /admin/master/console/*
,其根網址為 ${authAdminUrl}
。
持續使用者工作階段
先前版本的 Keycloak 僅在資料庫中儲存離線使用者和離線用戶端工作階段。新的 persistent-user-sessions
功能不僅將線上使用者工作階段和線上用戶端工作階段儲存在記憶體中,還儲存在資料庫中。這將允許使用者即使在重新啟動或升級 Keycloak 的所有執行個體後仍保持登入狀態。
啟用持續使用者工作階段
此功能是預覽功能,預設為停用。若要使用它,請將以下內容新增至您的建置命令
bin/kc.sh build --features=persistent-user-sessions ...
如果為僅使用內嵌 Infinispan 儲存工作階段的現有部署啟用此功能,則現有的線上使用者和用戶端工作階段將不會遷移至資料庫。它只會影響新建立的線上使用者和線上用戶端工作階段。 |
啟用持續工作階段後,線上使用者工作階段、離線使用者工作階段、線上用戶端工作階段和離線用戶端工作階段的記憶體內快取預設會限制為每個節點 10000 個項目,這將減少較大型安裝的 Keycloak 整體記憶體使用量。從記憶體中逐出的項目將在需要時從資料庫按需載入。若要為快取設定不同的大小,請編輯 Keycloak 的快取組態檔,為這些快取設定 <memory max-count="..."/>
。一旦啟用此功能,預計每次登入、登出和重新整理權杖請求時資料庫使用率都會增加。
若要 Keycloak 多站點設定中在外部 Infinispan 中組態快取大小,請參閱更新的使用 Infinispan Operator 為 HA 部署 Infinispan 指南。
啟用此功能後,不再提供 spi-user-sessions-infinispan-offline-session-cache-entry-lifespan-override
和 spi-user-sessions-infinispan-offline-client-session-cache-entry-lifespan-override
選項,因為它們先前用於覆寫離線工作階段在記憶體中保留的時間。
在升級期間遷移使用者工作階段
從 Keycloak 24 或更早版本升級時,管理員可以選擇將現有的線上使用者和用戶端工作階段遷移到持續工作階段。若要使其運作,這些現有的工作階段需要儲存在遠端 Infinispan 或設定為 Keycloak 內嵌快取的 JDBC 持久性的資料庫中。不支援 Keycloak 24 的記憶體內工作階段遷移,因為由於內嵌 Infinispan 的主要版本升級,在升級之前需要關閉所有 Keycloak 執行個體。
使用者工作階段的遷移僅在升級到 Keycloak 25 時啟用持續使用者工作階段時才有效。如果您選擇升級到 25 而不啟用持續使用者工作階段,則目前無法在稍後的時間點觸發現有工作階段的遷移。 稍後透過組態變更啟用此功能,如果持久和非持久工作階段同時存在,可能會導致 Keycloak 相關工作階段的未定義行為。為了防止這種情況,請在第一個節點啟用該功能啟動之前,移除所有現有的線上使用者和用戶端工作階段。這表示需要停止所有 Keycloak 節點,如果使用,則需要清除 Infinispan 遠端快取儲存區和內嵌 Infinispan JDBC 持久性。 |
若要在升級 Keycloak 期間遷移使用者工作階段,請執行下列步驟
-
停止所有正在執行的舊 Keycloak 執行個體。
-
建立備份
-
建立 Keycloak 資料庫的備份。
-
如果使用 JDBC 持久性,如果要能夠重試工作階段的遷移,請建立該資料庫的備份。
-
如果使用外部 Infinispan,如果要能夠重試工作階段的遷移,請建立其資料的備份。
-
-
啟動啟用持續使用者工作階段功能的新 Keycloak 執行個體。
第一個啟動的節點將
-
將資料庫遷移到架構版本 25。
-
將所有階段資訊從遠端 Infinispan 或為 Keycloak 嵌入式快取配置的 JDBC 持久化複製到 Keycloak 的資料庫。
資料將會儲存在
offline_user_session
和offline_client_session
資料表中,並將offline_flag
設定為false
。 -
清除快取。
這包括清除外部 Infinispan 的快取(如果有的話),以及清除 JDBC 持久化(如果有的話)。
-
-
更新 Keycloak 快取
sessions
和clientSessions
的快取配置 XML。-
如果使用 JDBC 持久化,請移除 JDBC 持久化的配置。
-
如果遠端 Infinispan 僅在單站點設定中使用,用於在 Keycloak 重新啟動時保持使用者階段,請移除這些快取的遠端 Infinispan 配置。
如果遠端 Infinispan 在多站點設定中使用,您可以透過設定記憶體中的條目數量來減少外部 Infinispan 的資源消耗。請使用使用 Infinispan 運算元部署 Infinispan 以實現高可用性指南中概述的設定。 -
-
滾動重新啟動 Keycloak 以啟用新的快取配置 XML。
預設啟用 HTTP 端點的指標
Keycloak 提供的指標現在包含以 http_server
開頭的 HTTP 伺服器指標。請參閱下方的一些範例。
http_server_active_requests 1.0
http_server_requests_seconds_count{method="GET",outcome="SUCCESS",status="200",uri="/realms/{realm}/protocol/{protocol}/auth"} 1.0
http_server_requests_seconds_sum{method="GET",outcome="SUCCESS",status="200",uri="/realms/{realm}/protocol/{protocol}/auth"} 0.048717142
使用新的選項 http-metrics-histograms-enabled
和 http-metrics-slos
來啟用預設的直方圖儲存區或服務級目標 (SLO) 的特定儲存區。如需更多關於直方圖的資訊,請參閱 Prometheus 關於直方圖的文件,瞭解如何使用 http_server_requests_seconds_bucket
中提供的其他指標序列。
Argon2 密碼雜湊
在 Keycloak 24 版本中,我們在密碼雜湊演算法中進行了變更,導致 CPU 使用率增加。為了處理這個問題,我們為非 FIPS 環境選擇了不同的預設雜湊演算法 Argon2,這將 CPU 使用率恢復到 Keycloak 24 版本之前的狀態。
限制取用 HTTP 回應時的記憶體使用量
在某些情況下,例如中介,Keycloak 使用 HTTP 與外部伺服器通訊。為了避免在這些提供者傳送過多資料時發生阻斷服務,Keycloak 現在預設將回應限制為 10 MB。
使用者可以透過設定提供者配置選項 spi-connections-http-client-default-max-consumed-response-size
來配置此限制
bin/kc.[sh|bat] --spi-connections-http-client-default-max-consumed-response-size=1000000
主機名稱驗證原則
spi-truststore-file-hostname-verification-policy
和新的 tls-hostname-verifier
選項的預設值現在為 DEFAULT,而不是 WILDCARD。WILDCARD 和 STRICT 選項值已棄用 - 您應該只依賴 DEFAULT 即可。
WILDCARD 支援但 DEFAULT 不支援的行為:* 允許子網域名稱中的萬用字元(例如 *.foo.com)來比對任何內容,包括多個層級(例如 a.b.foo.com)。* 允許比對知名的公開後綴 - 例如 foo.co.gl 可能會比對 *.co.gl
STRICT 支援但 DEFAULT 不支援的行為:* STRICT 在判斷萬用字元是否比對時,會對以 2 個字母頂級結尾的 2 或 3 個字母網域名稱使用一個小型排除清單(*.XXX.YY)。相反地,DEFAULT 使用來自 https://publicsuffix.org/list/ 的更完整的公開後綴規則和排除清單。
不希望您依賴 WILDCARD 或 STRICT 選項中的這些行為。
解決過期驗證階段的「您已登入」問題
當驗證階段過期且使用者已登入時,Keycloak 現在不會向最終使用者顯示「您已登入」的訊息。相反地,它會將有關過期驗證階段的錯誤重新導向到用戶端應用程式,以便用戶端可以對其採取動作並重新開始驗證,如伺服器管理指南驗證階段章節中所述。您可能會考慮更新您的應用程式,使其能夠處理此錯誤。
移除模型模組
模組 org.keycloak:keycloak-model-legacy
模組已在先前的版本中棄用,並在此版本中移除。請改用 org.keycloak:keycloak-model-storage
模組。
XA 交易變更
-
選項
transaction-xa-enabled
的預設值將為 false,而不是 true。如果您想要 XA 交易支援,現在需要明確地將此選項設定為 true。 -
預設啟用 XA 交易復原支援。交易記錄將會儲存在 KEYCLOAK_HOME/data/transaction-logs。
在執行階段指定 cache
選項
選項 cache
、cache-stack
和 cache-config-file
不再是建置選項,而且只能在執行階段指定。這消除了因為它們而需要執行建置階段並重建映像的需要。請注意,它們在 build
階段不會被識別,因此您需要移除它們。
kcadm 和 kcreg 變更
kcadm 和 kcreg 如何剖析和處理選項和參數已變更。來自使用錯誤、錯誤的選項或參數的錯誤訊息可能與先前的版本略有不同。此外,使用錯誤的結束代碼將為 2,而不是 1。
移除自訂使用者屬性索引
當依使用者屬性搜尋使用者時,Keycloak 不再搜尋強制小寫比較的的使用者屬性名稱。這表示在搜尋時,Keycloak 使用者屬性資料表上的原生索引現在將會被使用。如果您已建立自己的索引(基於 lower(name)
)來加速搜尋,您現在可以移除它。
新的預設用戶端範圍 basic
名為 basic
的新用戶端範圍已新增為領域「預設」用戶端範圍,因此將會新增到所有新建立的 OIDC 用戶端。此用戶端範圍也會在移轉期間自動新增到所有現有的 OIDC 用戶端。
此範圍包含針對以下宣告預先配置的通訊協定對應器
-
sub
(請參閱下面專用章節中的詳細資訊) -
auth_time
這額外有助於減少輕量存取權杖中的宣告數量,但也提供配置始終自動新增的宣告的機會。
如果您的一些領域中已有名為 basic 的用戶端範圍,則新的用戶端範圍 basic 將不會新增到您的領域,也不會新增到任何用戶端。此特定案例將會忽略移轉。在這種情況下,您必須先將您的用戶端範圍重新命名為與 basic 不同的名稱,然後再移轉到此 Keycloak 版本,或者如果您在權杖中需要 sub 和 auth_time 宣告,您可能需要手動處理遺失的宣告,並且可能需要手動將對應的通訊協定對應器新增到您的一些用戶端範圍。 |
移除 session_state
宣告
包含與 sid
宣告相同值的 session_state
宣告現在已從所有權杖中移除,因為根據 OpenID Connect 前端通道登出和 OpenID Connect 後端通道登出規格,它並非必要。session_state
宣告仍會根據 OpenID Connect 階段管理規格,存在於存取權杖回應中。
請注意,setSessionState()
方法也已從 IDToken
類別中移除,改為使用 setSessionId()
方法,而 getSessionState()
方法現在已棄用。
新的 階段狀態 (session_state)
對應器也包含在內,並且可以指派給用戶端範圍(例如 basic
用戶端範圍)以還原為舊行為。
如果使用舊版本的 JS 介面卡,也應該透過使用如上所述的用戶端範圍來使用 階段狀態 (session_state)
對應器。
透過協定對應器將 sub
宣告加入存取令牌
sub
宣告一直以來都會加入存取令牌中,現在預設會透過新的 Subject (sub)
協定對應器加入。
Subject (sub)
對應器預設會在 basic
用戶端範圍中設定。因此,升級到此版本後不需要額外設定。
如果您使用 Pairwise subject identifier
對應器來對應存取令牌的 sub
宣告,您可以考慮停用或移除 Subject (sub)
對應器,但這並非嚴格必要,因為 Subject (sub)
協定對應器會在 Pairwise subject identifier
對應器之前執行,因此 pairwise
值將會覆蓋 Subject (sub)
對應器加入的值。這也可能適用於其他自訂協定對應器實作,它們會覆蓋 sub
宣告,因為 Subject (sub)
對應器目前是第一個執行的協定對應器。
您可以使用 Subject (sub)
對應器來設定僅用於存取令牌、輕量級存取令牌和內省回應的 sub
宣告。IDToken 和 Userinfo 始終包含 sub
宣告。
此對應器對服務帳戶沒有影響,因為沒有使用者工作階段存在,並且 sub
宣告始終會加入存取令牌中。
Nonce 宣告僅加入 ID 令牌
現在 nonce 宣告僅嚴格依照 OpenID Connect Core 1.0 規範加入 ID 令牌。如規範所述,當授權請求中傳送相同的參數時,該宣告在 ID 令牌內是強制性的。規範也建議在 重新整理請求之後不要加入 nonce
。先前,該宣告在所有回應(包括重新整理)中設定給所有令牌(存取、重新整理和 ID)。
軟體中也包含新的 Nonce backwards compatible
對應器,可以將其指派給用戶端範圍以還原舊行為。例如,JS 轉接器在修正 #26651 於 24.0.0 版本中的問題之前,會檢查所有令牌中傳回的 nonce
宣告。因此,如果使用舊版本的 JS 轉接器,則應透過使用用戶端範圍將對應器加入所需的用戶端中。
變更與重新整理令牌相關事件的 userId
REFRESH_TOKEN
事件中的 userId
現在始終從使用者工作階段取得,而不是從重新整理令牌中的 sub
宣告取得。REFRESH_TOKEN_ERROR
事件中的 userId
現在始終為 null。此變更的原因是,隨著可選 sub
宣告的引入,重新整理令牌中的 sub
宣告值可能為 null,或者在使用成對主體識別碼或其他覆蓋 sub
宣告的方式時,甚至可能與真實的使用者 ID 不同。
然而,現在加入了一個 refresh_token_sub
詳細資訊作為向後相容性,以便在 REFRESH_TOKEN_ERROR
事件中缺少 userId 的情況下提供有關使用者的資訊。
使用較舊的 JavaScript 轉接器
如果您在應用程式中使用最新的 Keycloak 伺服器搭配較舊版本的 JavaScript 轉接器,您可能會受到上述令牌變更的影響,因為先前版本的 JavaScript 轉接器依賴 Keycloak 加入的宣告,但 OIDC 規範並不支援這些宣告。這包括
-
如果使用 Keycloak JavaScript 轉接器 24.0.3 或更舊版本,則加入
Session State (session_state)
對應器 -
如果使用早於 Keycloak 24 的 Keycloak JavaScript 轉接器,則加入
Nonce backwards compatible
對應器
您可以將協定對應器直接加入對應的用戶端,或加入某些用戶端範圍,這些用戶端範圍可以被依賴於較舊版本 Keycloak JavaScript 轉接器的用戶端應用程式使用。有關 session_state
和 nonce
宣告的更多詳細資訊,請參閱先前的章節。
預設 http-pool-max-threads
減少
如果未設定 http-pool-max-threads
,則預設值將為 50 或 4 x(可用處理器)的較大者。先前預設值為 200 或 8 x(可用處理器)的較大者。在大多數使用情境中,減少任務執行緒的數量將會因減少活動執行緒之間的內容切換而產生稍高的效能。
度量和健康端點的管理埠
/health
和 /metrics
端點可透過預設啟用的管理埠 9000
存取。這表示這些端點不再暴露於標準 Keycloak 埠 8080
和 8443
。
為了反映舊的行為,請使用屬性 --legacy-observability-interface=true
,這將不會在管理埠上暴露這些端點。然而,此屬性已棄用,將在未來版本中移除,因此建議不要使用它。
管理介面使用與預設 Keycloak HTTP 伺服器不同的 HTTP 伺服器,並且可以單獨設定它們。請注意,如果未提供管理介面屬性的值,則它們會繼承自預設 Keycloak HTTP 伺服器。
如需更多詳細資訊,請參閱設定管理介面。
逸出群組路徑中的斜線
Keycloak 從未逸出群組路徑中的斜線。因此,名為 group/slash
的群組在 top
下方會使用完整路徑 /top/group/slash
,這顯然會產生誤導。從此版本開始,可以啟動伺服器以執行名稱中斜線的逸出。
bin/kc.[sh|bat] start --spi-group-jpa-escape-slashes-in-group-path=true
逸出字元是波浪符號 ~
。先前的範例會產生路徑 /top/group~/slash
。逸出標記最後一個斜線是名稱的一部分,而不是層次結構分隔符。
逸出目前預設為停用,因為它代表行為的變更。儘管如此,仍建議啟用逸出,並且在未來版本中可能會是預設值。
變更為 EnvironmentDependentProviderFactory
類別
方法 EnvironmentDependentProviderFactory.isSupported()
已被棄用數個版本,現在已移除。
請改為實作 isSupported(Config.Scope config)
。
移除已棄用的 LinkedIn 提供者
在 22.0.2 版本中,LinkedIn 的 OAuth 2.0 社交提供者已由新的 OpenId Connect 實作取代。舊版提供者已棄用但未移除,以防它在某些現有領域中仍然可以使用。Keycloak 25.0.0 確實移除了舊版提供者及其相關的 linkedin-oauth
功能。從現在開始,預設的 LinkedIn
社交提供者是唯一可用的選項。
改善 findGrantedResources
和 findGrantedOwnerResources
查詢的效能
當 RESOURCE_SERVER_RESOURCE
和 RESOURCE_SERVER_PERM_TICKET
表格的條目超過 10 萬個,且使用者被授予超過 1 千個資源的存取權時,這些查詢的效能會很差。查詢已簡化,並為 requester
和 owner
欄位引入了新的索引。
新的索引都已套用至 RESOURCE_SERVER_PERM_TICKET
表格。如果表格目前包含超過 300,000 個條目,Keycloak 將會在自動結構描述移轉期間預設跳過索引的建立,而是會在移轉期間將 SQL 陳述式記錄到主控台上。在這種情況下,必須在 Keycloak 啟動後在資料庫中手動執行陳述式。
有關如何設定不同限制的詳細資訊,請參閱升級指南。
從 AccessToken
、IDToken
和 JsonWebToken
類別中移除已棄用的方法
以下方法已從 AccessToken
類別中移除
-
expiration
。請改用exp
方法。 -
notBefore
。請改用nbf
方法。 -
issuedAt
。請改用iat
方法。
以下方法已從 IDToken
類別中移除
-
getAuthTime
和setAuthTime
。請分別改用getAuth_time
和setAuth_time
方法。 -
notBefore
。請改用nbf
方法。 -
issuedAt
。請改用iat
方法。 -
setSessionState
。請改用setSessionId
方法(請參閱上述關於session_state
宣告章節中的詳細資訊)
以下方法已從 JsonWebToken
類別中移除
-
expiration
。請改用exp
方法。 -
notBefore
。請改用nbf
方法。 -
issuedAt
。請改用iat
方法。
您也應預期令牌中未設定 exp
和 nbf
宣告,因為它們是可選的。先前,這些宣告會設定為值 0
,這沒有意義,因為它們的值應為有效的 NumericDate
。
方法 getExp
已加入 SingleUseObjectKeyModel
由於從 AccessToken
、IDToken
和 JsonWebToken
中移除了已棄用的方法,SingleUseObjectKeyModel
也進行了變更,以保持與到期值相關的方法名稱一致。
先前的 getExpiration
方法現在已棄用,您應優先使用新引入的 getExp
方法,以避免 2038 年之後發生溢位。
PasswordHashProvider 上棄用方法 encode
介面 org.keycloak.credential.hash.PasswordHashProvider
上的方法 String encode(String rawPassword, int iterations)
已棄用。該方法將在未來 Keycloak 版本中移除。可能會在 Keycloak 27 版本中移除。
CollectionUtil intesection 方法已移除
方法 org.keycloak.common.util.CollectionUtil.intersection
已移除。您應在現有集合上改用 'java.util.Collection.retainAll'。
Resteasy util 類別已棄用
org.keycloak.common.util.Resteasy
已棄用。您應改用 org.keycloak.util.KeycloakSessionUtil
來取得 KeycloakSession
。
強烈建議避免透過建立自訂提供者以外的方式取得 KeycloakSession
。
工作階段生命週期和閒置計算的微小變更
在先前版本中,當驗證工作階段是否仍然有效時,工作階段最大生命週期和閒置逾時計算略有不同。因為現在該驗證使用與專案其餘部分相同的程式碼。
如果工作階段使用記住我功能,則閒置逾時和最大生命週期是常見 SSO 和記住我設定值之間的最大值。
外部 Infinispan 需求
Keycloak 現在要求外部 Infinispan 部署至少使用 15.0.0 版本的 Infinispan 伺服器。如 HA 指南中所述,多站點設定支援外部 Infinispan 部署。
Oracle 資料庫驅動程式不是發行版的一部分
Oracle 資料庫 JDBC 驅動程式不再是 Keycloak 發行版的一部分。如果您希望使用 Oracle DB,您必須手動安裝與您的特定環境相容的 Oracle 驅動程式版本。有關此流程的說明,請參閱設定資料庫指南。
已棄用的佈景主題變數
以下變數在 Admin 佈景主題中已棄用,將在未來版本中移除
-
authServerUrl
。請改用serverBaseUrl
。 -
authUrl
。請改用adminBaseUrl
。
以下變數在帳戶佈景主題中已棄用,將在未來版本中移除
-
authServerUrl
。請改用serverBaseUrl
,請注意serverBaseUrl
不包含尾隨斜線。 -
authUrl
。請改用serverBaseUrl
,請注意serverBaseUrl
不包含尾隨斜線。
在用戶端工作階段中取得和設定目前重新整理令牌的方法現在已棄用
介面 org.keycloak.models.AuthenticatedClientSessionModel
中的方法 String getCurrentRefreshToken()
、void setCurrentRefreshToken(String currentRefreshToken)
、int getCurrentRefreshTokenUseCount()
和 void setCurrentRefreshTokenUseCount(int currentRefreshTokenUseCount)
已被棄用。它們已被類似的方法取代,這些方法需要一個識別符號作為參數,例如 getRefreshToken(String reuseId)
,以便在客戶端會話中管理多個刷新令牌。這些方法將在未來版本的 Keycloak 中移除。可能在 Keycloak 27 版本中移除。
遷移至 24.0.4
透過管理使用者 API 更新使用者時,不再支援對使用者屬性進行部分更新
透過管理使用者 API 更新使用者屬性時,更新使用者屬性時無法執行部分更新,包括根屬性,如 username
、email
、firstName
和 lastName
。
如果您透過管理使用者 API 更新使用者屬性,但未傳遞管理員具有寫入權限的所有屬性,則會移除遺失的屬性。另一方面,如果某個屬性被標記為管理員的唯讀,則不傳送該屬性不會將其移除。
有關使用者設定檔設定的詳細資訊,請參閱使用者設定檔文件。
遷移至 24.0.3
org.keycloak.userprofile.UserProfileDecorator
介面的變更
為了在領域中正確支援多個使用者儲存供應商,org.keycloak.userprofile.UserProfileDecorator
介面已變更。
decorateUserProfile
方法不再於首次剖析使用者設定檔設定 (並快取它) 時叫用,而是在每次透過使用者設定檔供應商管理使用者時叫用。因此,該方法變更了其合約為
List<AttributeMetadata> decorateUserProfile(String providerId, UserProfileMetadata metadata)
與先前的合約和行為不同,此方法僅針對從中載入使用者的使用者儲存供應商叫用。
遷移至 24.0.0
歡迎主題的變更
「歡迎」主題已更新為使用新的佈局,現在使用 PatternFly 5,而不是 PatternFly 3。如果您正在擴充主題或提供自己的主題,則可能需要按如下方式更新它
從 PatternFly 3 遷移至 PatternFly 5
歡迎主題是 Keycloak 中較過時的主題之一。它最初基於 PatternFly 3,但現在已更新為使用 PatternFly 5,在此過程中跳過了一個主要版本。如果您的自訂主題擴充了內建主題,則您需要將其更新為使用 PatternFly 5 語法。有關詳細資訊,請參閱PatternFly 5 文件。
如果您仍然在自己的自訂主題中使用 PatternFly 3 (而不是擴充內建主題),則可以繼續使用它,但 PatternFly 3 支援將在未來的版本中移除,因此您應考慮儘快遷移至 PatternFly 5。
自動重新導向至管理主控台
如果已啟用管理主控台,則如果管理使用者已存在,歡迎頁面將自動重新導向至該主控台。可以透過在您的 theme.properties
檔案中設定 redirectToAdmin
來修改此行為。預設情況下,該屬性設定為 false
,除非您正在擴充內建主題,在這種情況下,該屬性設定為 true
。
帳戶主控台主題自訂的變更
如果您先前正在擴充現已棄用的帳戶主控台主題版本 2,則您需要更新您的主題以使用新的帳戶主控台主題版本 3。新版本的帳戶主控台主題在自訂方式方面有一些變更。若要從全新的狀態開始,您可以遵循新的自訂快速入門。
若要移動您的自訂主題,請先將 parent
變更為新主題
# Before
parent=keycloak.v2
# After
parent=keycloak.v3
如果您有任何自訂 React 元件,您將直接匯入 React,而不是使用相對路徑
// Before
import * as React from "../../../../common/keycloak/web_modules/react.js";
// After
import React from "react";
如果您使用 content.json
來自訂主題,則檔案的結構有一些變更,特別是
-
content
屬性已重新命名為children
。 -
已移除
id
、icon
和componentName
屬性,因為modulePath
提供相同的功能。
可能需要更新 Keycloak JS 匯入
如果您直接從 Keycloak 伺服器載入 Keycloak JS,則可以安全地忽略此節。如果您從 NPM 套件載入 Keycloak JS 並且正在使用 Webpack、Vite 等捆綁器,則可能需要對您的程式碼進行一些變更。Keycloak JS 套件現在在 package.json 檔案中使用 exports
欄位。這表示您可能必須變更您的匯入
// Before
import Keycloak from 'keycloak-js/dist/keycloak.js';
import AuthZ from 'keycloak-js/dist/keycloak-authz.js';
// After
import Keycloak from 'keycloak-js';
import AuthZ from 'keycloak-js/authz';
功能變更
不再允許在 --features
和 --features-disabled
清單中都有相同的功能。該功能應僅出現在一個清單中。
在 --features
清單中使用未版本化的功能名稱 (例如 docker
) 將允許為您啟用最受支援/最新的功能版本。如果您需要在各個版本之間有更可預測的行為,請參考您想要的版本,例如 docker:v1
。
使用者設定檔變更
預設啟用使用者設定檔
使用者設定檔功能現在預設為啟用。declarative-user-profile
功能不再可用,因為假設已啟用使用者設定檔。因此,使用者設定檔已啟用 切換已從 領域設定 中移除,並替換為 未受管理屬性。從先前版本遷移時,行為如下
-
對於 使用者設定檔已啟用 設定為 開啟 的部署,升級後 未受管理屬性 將設定為 關閉。因此,只會允許使用者設定檔明確支援的使用者屬性。
-
對於 使用者設定檔已啟用 設定為 關閉 的部署 (這也是停用
declarative-user-profile
功能的部署的預設設定,這也是預設值),升級後 未受管理屬性 將設定為 開啟。因此,行為應與先前版本中停用使用者設定檔的情況基本相同。屬性 索引標籤將保留在管理主控台的使用者詳細資料部分中。此外,只要特定自訂主題支援,使用者現在可以透過 UI 頁面 (例如註冊頁面和更新設定檔頁面) 設定任意屬性。自訂主題也應像以前一樣運作。但是,請考慮更新您的主題以使用使用者設定檔,如果需要新增自訂屬性,甚至可以移除您的自訂主題。請參閱後續關於主題的章節。此外,請考慮將 未受管理屬性 切換為 關閉,或僅針對管理員啟用此切換,以便您可以主要依賴使用受管理屬性。
有關 未受管理屬性 的詳細資訊,請參閱使用者設定檔文件。
預設驗證
預設使用者設定檔設定包含一組基本預定義欄位的預設驗證。當預設停用 declarative-user-profile
功能時,這些驗證在先前版本中不存在。如果您因回溯相容性而遇到問題,您可以根據自己的需求變更預設驗證器。預設驗證器如下
-
username
、email
、firstName
和lastName
屬性的最大長度為 255 個字元。這些驗證在先前的版本中也間接存在,因為資料庫對USER_ENTITY
表格中這些欄位的限制為最大長度 255 個字元。然而,當使用使用者儲存供應商時,先前可能可以使用更長的值。 -
username
屬性的最小長度為三個字元。username
預設還有username-prohibited-characters
和up-username-not-idn-homograph
驗證器,這些在先前的版本中並不存在。關於這些屬性的詳細資訊,請參閱使用者設定檔文件的驗證章節。請注意,除非您啟用 realm 的「啟用編輯使用者名稱」開關,否則預設情況下使用者名稱是不可編輯的。這項變更表示具有不正確使用者名稱的現有使用者應該仍然可以正常運作,而且不會被強制更新他們的使用者名稱。但是,新使用者在註冊或由管理員 REST API 建立時,將會被強制使用正確的使用者名稱。 -
firstName
和lastName
屬性具有person-name-prohibited-characters
驗證器,這些驗證器在先前的版本中並不存在。關於這些屬性的詳細資訊,請參閱使用者設定檔文件的驗證章節。請注意,名字和姓氏預設都是可編輯的,因此先前版本中已經有此類不正確名字/姓氏的使用者,在更新他們的使用者設定檔時,將會被強制更新它們。
具有特殊字元的使用者屬性名稱
在先前的版本中,您可以建立具有例如 some:attribute
或 some/attribute
等屬性名稱的使用者。使用者設定檔故意不允許您在使用者設定檔設定中建立具有此類特殊名稱的屬性。因此,您可能需要為您的 realm 設定「未受管理屬性」,並為管理員(理想情況下)或最終使用者(如果確實需要)啟用未受管理屬性。儘管強烈建議避免使用此類屬性名稱。
「驗證設定檔」必要操作預設啟用
verify-profile
必要操作預設為新 realm 啟用。然而,當您從先前的版本移轉時,您現有的 realm 將會具有與先前相同的 verify-profile
操作狀態,這通常表示已停用,因為它在先前的版本中預設為停用。關於此必要操作的詳細資訊,請參閱使用者設定檔文件。
使用者設定檔 SPI 的重大變更
如果您在您的擴充功能中使用使用者設定檔 SPI,您可能會受到此版本中引入的 API 變更影響。
org.keycloak.userprofile.Attributes
介面包含以下變更
-
方法
getValues
已重新命名為get
,使其更符合常規 JavaMap
的相同操作 -
方法
isRootAttribute
已移至公用程式類別org.keycloak.userprofile.UserProfileUtil.isRootAttribute
-
方法
getFirstValue
已重新命名為getFirst
,以使其不那麼冗長 -
方法
getReadable(boolean)
已移除,現在只要具有讀取權限,就會傳回所有屬性(包括根屬性)。
基於使用者設定檔和 realm 呈現頁面的 Freemarker 範本變更
在此版本中,已更新以下範本,以使其能夠根據為 realm 設定的使用者設定檔動態呈現屬性
-
login-update-profile.ftl
-
register.ftl
-
update-email.ftl
這些範本分別負責呈現更新設定檔(當為使用者啟用「更新設定檔」必要操作時)、註冊和更新電子郵件(當啟用「UPDATE_EMAIL」功能時)頁面。
如果您使用自訂主題來變更這些範本,它們將會如預期般運作,因為只會更新內容。然而,我們建議您查看如何設定{宣告式使用者設定檔},並且盡可能避免透過使用此功能提供的所有功能來變更內建範本。
此外,declarative-user-profile
功能用來呈現相同流程頁面的範本已不再需要,並在此版本中移除
-
update-user-profile.ftl
-
register-user-profile.ftl
如果您在先前的版本中使用 declarative-user-profile
功能,並且對上述範本進行了自訂,請相應地更新 login-update-profile.ftl
和 register.ftl
。
透過代理商首次登入時,用於更新設定檔頁面的新 Freemarker 範本
在此版本中,當使用者第一次透過代理商進行身份驗證時,伺服器將會使用 idp-review-user-profile.ftl
範本呈現更新設定檔頁面。
在先前的版本中,用於在首次代理商登入流程中更新設定檔的範本是 login-update-profile.ftl
,與使用者向 realm 進行身份驗證時用來更新設定檔的範本相同。
透過對每個流程使用不同的範本,可以更清楚地區分範本實際用於哪個流程,而不是共用同一個範本,並可能引入不應僅影響特定流程頁面的意外變更和行為。
如果您對 login-update-profile.ftl
範本進行了自訂,以自訂使用者在透過代理商進行身份驗證時更新其設定檔的方式,請務必將您的變更移至新的範本。
信任儲存區變更
spi-truststore-file-*
選項和與信任儲存區相關的選項 https-trust-store-*
已被棄用。因此,請使用信任儲存區材料的新預設位置 conf/truststores
,或使用 truststore-paths
選項指定您想要的路徑。有關詳細資訊,請參閱相關的指南。
應該使用 tls-hostname-verifier
屬性,而不是 spi-truststore-file-hostname-verification-policy
屬性。
變更的附帶影響是,現在信任儲存區提供者總是會設定一些憑證(至少存在預設的 Java 受信任憑證)。此新行為可能會影響 Keycloak 的其他部分。
例如,如果將「證明傳達」設定為「直接」驗證,則 webauthn 註冊可能會失敗。先前,如果未設定信任儲存區提供者,則不會驗證傳入的憑證。但現在始終會執行此驗證。由於 dongle 發送的憑證鏈不受 Keycloak 信任,因此註冊會失敗並顯示 invalid cert path
錯誤。驗證器的憑證授權單位必須存在於信任儲存區提供者中,才能正確執行證明。
已棄用的 --proxy
選項
--proxy
選項已被棄用,並將在未來的版本中移除。下表說明已棄用選項如何對應到支援的選項。
已棄用的用法 | 新用法 |
---|---|
|
|
|
|
|
|
|
|
|
|
為了加強安全性,--proxy-headers 選項不允許同時選取 forwarded 和 xforwarded 值(就像先前使用 --proxy edge 和 --proxy reencrypt 的情況)。 |
當使用 proxy headers 選項時,請確保您的反向代理正確設定並覆寫 Forwarded 或 X-Forwarded-* 標頭。若要設定這些標頭,請查閱您的反向代理文件。錯誤的設定會使 Keycloak 暴露於安全漏洞。 |
您也可以在使用 Operator 時設定 proxy headers
apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
name: example-kc
spec:
...
proxy:
headers: forwarded|xforwarded
如果未指定 proxy.headers 欄位,Operator 會回復到先前的行為,預設情況下隱含設定 proxy=passthrough 。這會導致伺服器記錄中出現棄用警告。此回復將會在未來的版本中移除。 |
管理 API 和帳戶內容中使用者表示法的變更
org.keycloak.representations.idm.UserRepresentation
和 org.keycloak.representations.account.UserRepresentation
表示類別都已變更,以便當擷取或將表示法有效負載傳送至管理和帳戶 API 時,根使用者屬性(例如 username
、email
、firstName
、lastName
和 locale
)具有一致的表示法。
username
、email
、firstName
、lastName
和 locale
屬性已移至新的 org.keycloak.representations.idm.AbstractUserRepresentation
基底類別。
此外,getAttributes
方法的目標是僅表示自訂屬性,因此您不應期望在此方法傳回的 map 中找到任何根屬性。此方法的主要目標是當用戶端更新或擷取給定使用者的任何自訂屬性時。
為了解析所有屬性(包括根屬性),新增了一個新的 getRawAttributes
方法,以便產生的 map 也包含根屬性。然而,此方法無法從表示法有效負載取得,其目標是供伺服器在管理使用者設定檔時使用。
循序載入離線工作階段和遠端工作階段
從此版本開始,Keycloak 叢集的第一個成員將會循序載入遠端工作階段,而不是並行載入。如果啟用離線工作階段預先載入,這些工作階段也會循序載入。
先前的程式碼導致叢集在啟動時消耗大量資源,並且在生產環境中難以分析,如果節點在載入期間重新啟動,可能會導致複雜的失敗情境。因此,已將其變更為循序工作階段載入。
對於離線工作階段,Keycloak 在此版本和先前版本中的預設行為是根據需求載入這些工作階段,相較於嘗試平行預先載入它們,這在大量離線工作階段的情況下具有更好的擴展性。使用此預設設定的安裝不受離線工作階段載入策略變更的影響。已啟用離線工作階段預先載入的安裝應遷移到停用離線工作階段預先載入的設定。
已棄用的離線工作階段預先載入
Keycloak 的預設行為是根據需求載入離線工作階段。在啟動時預先載入它們的舊行為現已棄用,因為在啟動時預先載入它們無法隨著工作階段數量的增加而良好擴展,並會增加 Keycloak 的記憶體使用量。舊行為將在未來版本中移除。
若要重新啟用已棄用但尚未移除的舊行為,請使用如下所示的功能旗標和 SPI 選項
bin/kc.[sh|bat] start --features-enabled offline-session-preloading --spi-user-sessions-infinispan-preload-offline-sessions-from-database=true
UserSessionProvider
的 API 已棄用方法 getOfflineUserSessionByBrokerSessionId(RealmModel realm, String brokerSessionId)
。請改用 getOfflineUserSessionByBrokerUserIdStream(RealmModel, String brokerUserId)
來先取得使用者的工作階段,然後根據需要依據代理工作階段 ID 進行篩選。
Infinispan 指標使用標籤來表示快取管理器和快取名稱
當為 Keycloak 的嵌入式快取啟用指標時,這些指標現在會使用標籤來表示快取管理器和快取名稱。
vendor_cache_manager_keycloak_cache_sessions_statistics_approximate_entries_in_memory{cache="sessions",node="..."}
vendor_statistics_approximate_entries_in_memory{cache="sessions",cache_manager="keycloak",node="..."}
若要還原安裝的變更,請使用自訂的 Infinispan XML 設定,並按照以下方式變更設定
<metrics names-as-tags="false" />
使用者屬性值長度擴充
從此版本開始,Keycloak 支援儲存和搜尋長度超過 255 個字元的使用者屬性值,這在之前是個限制。
在允許使用者更新屬性的設定中(例如透過帳戶控制台),請新增驗證以防止阻斷服務攻擊。確保不允許任何未受管理的屬性,並且所有可編輯的屬性都有驗證來限制輸入長度。
對於未受管理的屬性,最大長度為 2048 個字元。對於受管理的屬性,預設最大長度為 2048 個字元。管理員可以透過新增類型為 length
的驗證器來變更此設定。
Keycloak 會在其內部快取中快取與使用者相關的物件。使用較長的屬性會增加快取所消耗的記憶體。因此,建議限制長度屬性的大小。考慮將大型物件儲存在 Keycloak 外部,並以 ID 或 URL 引用它們。 |
此變更會在 USER_ATTRIBUTE
和 FED_USER_ATTRIBUTE
表格上新增索引。如果這些表格包含超過 300000 個條目,Keycloak 在自動結構描述遷移期間預設會跳過索引建立,而是在遷移期間於主控台上記錄 SQL 陳述式,以便在 Keycloak 啟動後手動套用。請參閱升級指南以了解如何設定不同的限制。
新增加的索引 USER_ATTR_LONG_VALUES_LOWER_CASE 和 FED_USER_ATTR_LONG_VALUES_LOWER_CASE 在資料庫以相容模式執行時,可能會超過 Oracle 設定的 30 個字元的最大限制。自 Oracle 12.2 版以來,支援更長的索引名稱。 |
管理員傳送驗證電子郵件 API 現在使用相同的電子郵件驗證範本
PUT /admin/realms/{realm}/users/{id}/send-verify-email
在此版本中,API 將使用 email-verification.ftl
範本,而不是 executeActions.ftl
。
Perform the following action(s): Verify Email
Confirm validity of e-mail address email@example.org.
如果您已自訂 executeActions.ftl
範本來修改使用者如何使用此 API 驗證其電子郵件,請確保將您的修改轉移到新的範本。
將引入一個名為 lifespan
的新參數,以允許覆寫預設的生命週期值 (12 小時)。
如果您偏好先前的行為,請如下所示使用 execute-actions-email
API。
PUT /admin/realms/{realm}/users/{id}/execute-actions-email ["VERIFY_EMAIL"]
移除已棄用的 SAML 加密模式
版本 21 中引入的 SAML 加密相容模式現已移除。伺服器不再管理系統屬性 keycloak.saml.deprecated.encryption
。仍使用舊簽署金鑰進行加密的用戶端應從新的 IDP 組態中繼資料更新它。
密碼雜湊的變更
在此版本中,我們調整了密碼雜湊的預設值,以符合 OWASP 密碼儲存建議。
作為此變更的一部分,預設密碼雜湊供應商已從 pbkdf2-sha256
變更為 pbkdf2-sha512
。此外,基於 pbkdf2
的密碼雜湊演算法的預設雜湊迭代次數也變更如下
供應商 ID | 演算法 | 舊迭代次數 | 新迭代次數 |
---|---|---|---|
|
|
20.000 |
1.300.000 |
|
|
27.500 |
600.000 |
|
|
30.000 |
210.000 |
如果領域未明確配置具有 hashAlgorithm
和 hashIterations
的密碼原則,則新配置將在下一次基於密碼的登入時,或在建立或更新使用者密碼時生效。
新密碼雜湊設定的效能
在具有 Intel i9-8950HK CPU (12) @ 4.800GHz 的機器上進行的測試,產生了雜湊 1000 個密碼的以下 ⌀ 時間差異 (3 次執行的平均值)。請注意,由於執行時間較長,PBKDF2WithHmacSHA1
的平均持續時間是以較少的密碼計算的。
供應商 ID | 演算法 | 舊持續時間 | 新持續時間 | 差異 |
---|---|---|---|---|
|
|
122 毫秒 |
3.114 毫秒 |
+2.992 毫秒 |
|
|
20 毫秒 |
451 毫秒 |
+431 毫秒 |
|
|
33 毫秒 |
224 毫秒 |
+191 毫秒 |
pbkdf2
供應商的使用者可能需要明確減少雜湊迭代次數,以恢復可接受的效能。這可以透過在領域的密碼原則中明確設定雜湊迭代次數來完成。
預期整體 CPU 使用率增加和暫時性資料庫活動增加
Keycloak 高可用性指南中關於調整 CPU 和記憶體資源大小的概念已更新,以反映新的雜湊預設值。在我們的測試中,每次基於密碼登入的 CPU 使用率增加了五倍,其中包括變更的密碼雜湊和未變更的 TLS 連線處理。由於 Keycloak 的其他活動(如重新整理存取權杖和用戶端憑證授與)的平均效應,整體 CPU 增加應該在二到三倍左右。不過,這取決於安裝的獨特工作負載。
升級後,在基於密碼的登入期間,使用者的密碼將作為一次性活動以新的雜湊演算法和雜湊迭代次數重新雜湊,並在資料庫中更新。由於這會從 Keycloak 的內部快取中清除使用者,您還會看到資料庫層級的讀取活動增加。隨著越來越多的使用者密碼被重新雜湊,這種增加的資料庫活動將隨著時間推移而減少。
運算子參考的資源輪詢
透過 Keycloak CR 參考的 Secrets 和 ConfigMaps 現在將輪詢變更,而不是透過 API 伺服器監看。可能需要大約 1 分鐘才能偵測到變更。
這樣做是為了不需要在這些資源上操作標籤。升級後,如果任何 Secret 仍然具有 operator.keycloak.org/component 標籤,則可能會將其移除或忽略。
重新命名 JPA 供應商的遷移設定選項
移除 Map Store 後,以下設定選項已重新命名
-
spi-connections-jpa-legacy-initialize-empty
為spi-connections-jpa-quarkus-initialize-empty
-
spi-connections-jpa-legacy-migration-export
為spi-connections-jpa-quarkus-migration-export
-
spi-connections-jpa-legacy-migration-strategy
為spi-connections-jpa-quarkus-migration-strategy
重新命名模型模組
移除 Map Store 後,以下模組已重新命名
-
org.keycloak:keycloak-model-legacy-private
為org.keycloak:keycloak-model-storage-private
-
org.keycloak:keycloak-model-legacy-services
為org.keycloak:keycloak-model-storage-services
org.keycloak:keycloak-model-legacy
模組已棄用,並將在下一個版本中移除,改用 org.keycloak:keycloak-model-storage
模組。
暫時鎖定記錄已取代為事件
現在,當使用者因暴力破解保護器而被暫時鎖定時,會出現一個新的事件 USER_DISABLED_BY_TEMPORARY_LOCKOUT
。ID 為 KC-SERVICES0053
的記錄已移除,因為新事件以結構化形式提供資訊。
由於它是一個成功事件,因此預設會在 DEBUG
層級記錄新事件。使用 伺服器管理指南中的事件接聽程式章節所述的設定 spi-events-listener-jboss-logging-success-level
,以變更所有成功事件的記錄層級。
若要觸發自訂動作或自訂日誌條目,請依照伺服器開發人員指南中「事件監聽器 SPI」的說明,撰寫自訂事件監聽器。
Keycloak CR 資源選項
當 Keycloak CR 和 KeycloakRealmImport CR 中未指定 resources
選項時,將使用預設值。Keycloak 部署和 realm 匯入 Job 的預設 requests
記憶體設定為 1700MiB
,而 limits
記憶體則設定為 2GiB
。
Cookie 更新
作為 Keycloak 中 cookie 處理重構的一部分,cookie 的設定方式有一些變更
-
如果請求是通過安全上下文發出的,則所有 cookie 現在都會設定 secure 屬性
-
WELCOME_STATE_CHECKER
cookie 現在設定SameSite=Strict
對於自訂擴充功能,可能需要進行一些變更
-
由於 cookie 現在是通過 CookieProvider 管理,因此
LocaleSelectorProvider.KEYCLOAK_LOCALE
已被棄用 -
HttpResponse.setWriteCookiesOnTransactionComplete
已被移除 -
HttpCookie
已被棄用,請改用NewCookie.Builder
-
ServerCookie
已被棄用,請改用NewCookie.Builder
內部演算法從 HS256 變更為 HS512
Keycloak 用於簽署內部令牌(Keycloak 本身使用的 JWT,例如刷新令牌或動作令牌)的演算法,正從 HS256
變更為更安全的 HS512
。現在為 realm 新增了一個名為 hmac-generated-hs512
的金鑰供應器。請注意,在遷移的 realm 中,舊的 hmac-generated
供應器和舊的 HS256
金鑰會被保留,並且仍然會驗證升級前發出的令牌。按照輪換金鑰指南,當不再存在舊令牌時,可以手動刪除 HS256
供應器。
在容器中執行時,不同的 JVM 記憶體設定
在容器中執行時,JVM 選項 -Xms
和 -Xmx
已被 -XX:InitialRAMPercentage
和 -XX:MaxRAMPercentage
取代。Keycloak 不再使用靜態最大堆積大小設定,而是將最大值指定為容器總記憶體的 70%。
由於堆積大小是根據容器總記憶體動態計算的,因此您應**始終設定容器的記憶體限制**。
如果未設定記憶體限制,隨著最大堆積大小增長至容器總記憶體的 70%,記憶體消耗將會迅速增加。 |
如需更多詳細資訊,請參閱在容器中執行 Keycloak 指南。
GELF 日誌處理器已遭棄用
隨著提供與 GELF 整合的底層函式庫停止維護,Keycloak 將不再支援現成的 GELF 日誌處理器。此功能將在未來版本中移除。如果您需要外部日誌管理,請考慮使用檔案日誌剖析。
遷移至 23.0.5
jboss-logging 事件訊息的變更
由於問題#25078,jboss-logging
訊息值現在會被加上引號(預設為字元 "
),並經過清理以防止任何換行符號。供應器中有兩個新選項(spi-events-listener-jboss-logging-sanitize
和 spi-events-listener-jboss-logging-quotes
)可讓您自訂新行為。例如,若要避免清理和加上引號,伺服器可以採用以下方式啟動
./kc.sh start --spi-events-listener-jboss-logging-sanitize=false --spi-events-listener-jboss-logging-quotes=none ...
如需有關選項的更多資訊,請參閱所有供應器配置指南。
遷移至 23.0.2
用戶端的有效重新導向 URI 始終使用完全字串比對進行比較
1.8.0 版本在比較重新導向 URI 與用戶端指定的有效重新導向時,引入了主機名稱和方案的小寫。不幸的是,它並未在所有協定中完全運作,例如,http
的主機已小寫,但 https
則否。由於OAuth 2.0 安全性最佳實務建議使用完全字串比對來比較 URI,因此 Keycloak 將遵循該建議,並且從現在開始,即使是主機名稱和方案,也將使用完全相同的大小寫比較有效重新導向。
對於依賴舊行為的 realm,其用戶端的有效重新導向 URI 現在應為伺服器應識別的每個 URI 保留單獨的項目。
雖然在設定用戶端時引入了更多步驟和冗長,但新行為可以實現更安全的部署,因為基於模式的檢查經常是導致安全問題的原因。這些問題是因其如何實作以及如何配置而產生。
Operator -secrets-store Secret
舊版本的 operator 會建立 Secret 來追蹤受監控的 Secret。較新版本的 operator 不再使用 -secrets-store Secret,因此可以將其刪除。
如果您使用的是 23.0.0 或 23.0.1,並且在 operator 日誌中看到「org.keycloak.operator.controllers.KeycloakAdminSecretDependentResource → java.lang.IllegalStateException: More than 1 secondary resource related to primary」,則可以刪除 -secrets-store Secret,或是升級至 23.0.2,因為這不再是問題。
遷移至 23.0.0
在 OAuth 2.0/OpenID Connect 驗證回應中新增 iss 參數
RFC 9207 OAuth 2.0 授權伺服器發行者識別規範在 OAuth 2.0/OpenID Connect 驗證回應中新增了參數 iss
,以實現安全的授權回應。
在過去的版本中,我們沒有這個參數,但現在 Keycloak 預設會新增此參數,這是該規範的要求。
但是,某些 OpenID Connect/OAuth2 配接器,尤其是較舊的 Keycloak 配接器,可能存在此新參數的問題。
例如,在成功驗證至用戶端應用程式後,該參數將始終存在於瀏覽器 URL 中。在這些情況下,停用在驗證回應中新增 iss
參數可能很有用。這可以在 Keycloak 管理主控台中針對特定用戶端完成,在「OpenID Connect 相容性模式」區段中的用戶端詳細資料中進行描述,詳見與較舊配接器的相容性。存在專用的「從驗證回應中排除發行者」切換開關,可以開啟該開關以防止將 iss
參數新增至驗證回應。
萬用字元處理
JPA 在搜尋時允許萬用字元 %
和 _
,而其他供應器(例如 LDAP)僅允許 *
。由於 *
是 LDAP 中的自然萬用字元,因此它在所有位置都有效,而使用 JPA 時,它僅在搜尋字串的開頭和結尾有效。從此版本開始,唯一的萬用字元是 *
,它在搜尋字串中的所有位置都以一致的方式運作。特定供應器中的所有特殊字元(例如 JPA 的 %
和 _
)都會被逸出。對於精確搜尋,如果加上引號(例如 "w*ord"
),則其行為與先前版本中的相同。
佈景主題的語言檔案預設為 UTF-8 編碼
此版本現在遵循 Java 及更高版本的標準機制,該機制假設資源包檔案以 UTF-8 編碼。
先前版本的 Keycloak 支援在第一行使用註解(如 # encoding: UTF-8
)指定編碼,但此功能不再受支援,並且會被忽略。
現在以 UTF-8 編碼讀取佈景主題的訊息屬性檔案,並自動回復為 ISO-8859-1 編碼。如果您使用其他編碼,請將檔案轉換為 UTF-8。
由 realm 和用戶端角色對應器對應的宣告值格式的變更
在此版本之前,當停用 Multivalued
設定時,realm (User Realm Role
) 和用戶端 (User Client Role
) 通訊協定對應器都會對應字串化的 JSON 陣列。
然而,Multivalued
設定會指示是否應將聲明對應為列表,如果停用,則僅對應來自相同值列表的單個值。
在此版本中,角色和用戶端對應器現在會將使用者的有效角色對應為單個值(當它們被標記為單值時,即 Multivalued
停用)。
登入 UI 中密碼欄位的變更
在此版本中,我們希望引入一個切換開關來隱藏/顯示密碼輸入。
-
login.ftl
-
login-password.ftl
-
login-update-password.ftl
-
register.ftl
-
register-user-profile.ftl
一般而言,所有 <input type="password" name="password" />
現在都被封裝在一個 div 內。輸入元素後面跟著一個按鈕,該按鈕會切換密碼輸入的顯示狀態。
舊程式碼範例
<input type="password" id="password" name="password" autocomplete="current-password" style="display:none;"/>
新程式碼範例
<div class="${properties.kcInputGroup!}">
<input type="password" id="password" name="password" autocomplete="current-password" style="display:none;"/>
<button class="pf-c-button pf-m-control" type="button" aria-label="${msg('showPassword')}"
aria-controls="password" data-password-toggle
data-label-show="${msg('showPassword')}" data-label-hide="${msg('hidePassword')}">
<i class="fa fa-eye" aria-hidden="true"></i>
</button>
</div>
預設 Keycloak CR 主機名稱
在 OpenShift 上執行時,如果啟用 ingress,且 spec.ingress.classname 設定為 openshift-default,您可以將 Keycloak CR 中的 spec.hostname.hostname 保留為未填寫。操作員將會為 CR 的儲存版本分配一個預設的主機名稱,類似於沒有明確主機的 OpenShift Route 所建立的主機名稱 - 即 ingress-namespace.appsDomain。如果 appsDomain 變更,或者您因任何原因需要不同的主機名稱,請更新 Keycloak CR。
已移除已棄用的 auto-build
CLI 選項
auto-build
CLI 選項已標記為棄用很長一段時間。在此版本中,它已完全移除,不再支援。
執行 start
命令時,伺服器會根據組態自動建置。為了防止此行為,請設定 --optimized
旗標。
kc.sh 和 shell 中繼字元
kc.sh 不再對參數和環境變數 JAVA_OPTS_APPEND 和 JAVA_ADD_OPENS 使用額外的 shell eval,因此繼續使用雙重跳脫/引號將會導致參數被誤解。例如,而不是
bin/kc.sh start --db postgres --db-username keycloak --db-url "\"jdbc:postgresql://127.0.0.1:5432/keycloak?ssl=false&connectTimeout=30\"" --db-password keycloak --hostname localhost
使用單個跳脫
bin/kc.sh start --db postgres --db-username keycloak --db-url "jdbc:postgresql://127.0.0.1:5432/keycloak?ssl=false&connectTimeout=30" --db-password keycloak --hostname localhost
此變更也意味著您不能使用單引號值來調用 kc.sh 的所有引數。例如,您不能再使用
bin/kc.sh "start --help"
它必須是個別的引數
bin/kc.sh start --help
同樣地,而不是
bin/kc.sh build "--db postgres"
它必須是個別的引數
bin/kc.sh build --db postgres
在 Dockerfile run 命令中也需要使用個別的引數。
已移除 RegistrationProfile 表單動作
表單動作 RegistrationProfile
(在身份驗證流程的 UI 中顯示為 Profile Validation
)已從程式碼庫和所有身份驗證流程中移除。預設情況下,它位於每個 realm 的內建註冊流程中。使用者屬性的驗證以及使用者(包括該使用者的所有屬性)的建立皆由 RegistrationUserCreation
表單動作處理,因此不再需要 RegistrationProfile
。除非您在自己的提供者中使用 RegistrationProfile
類別,否則通常不需要針對此變更採取進一步的動作。
GroupProvider
變更
已新增一個新方法,允許搜尋和分頁瀏覽頂層群組。如果您實作此介面,您將需要實作以下方法
Stream<GroupModel> getTopLevelGroupsStream(RealmModel realm,
String search,
Boolean exact,
Integer firstResult,
Integer maxResults)
GroupRepresentation
變更
-
新增欄位
subGroupCount
,用於告知用戶端任何指定群組上有多少子群組 -
subGroups
列表現在僅在請求階層資料的查詢中填入 -
此欄位是從「底部向上」填入,因此不能依賴它來取得群組的所有子群組。請使用
GroupProvider
或從GET {keycloak server}/realms/{realm}/groups/{group_id}/children
請求子群組
群組管理 API 的新端點
新增端點 GET {keycloak server}/realms/{realm}/groups/{group_id}/children
,作為取得支援分頁的特定群組子群組的方法
RESTEeasy Reactive
依賴 RESTEasy Classic 已不再是一種選項,因為它不再可用。對於依賴 RESTEasy Classic 和 org.jboss.resteasy.spi.*
中相關套件的 SPI 和程式碼,將需要進行遷移。
部分匯出需要 manage-realm 權限
端點 POST {keycloak server}/realms/{realm}/partial-export
和管理主控台中對應的動作現在需要 manage-realm
權限才能執行,而不是 view-realm
。此端點會將 realm 設定匯出為 JSON 檔案,而新的權限更為合適。參數 exportGroupsAndRoles
和 exportClients
(分別在匯出中包含 realm 群組/角色和用戶端)繼續管理相同的權限(query-groups
和 view-clients
)。
移除修剪事件詳細資訊長度的選項
自此版本起,Keycloak 支援 EventEntity
詳細資訊欄位的長值。因此,它不再支援修剪事件詳細資訊長度的選項 --spi-events-store-jpa-max-detail-length
和 --spi-events-store-jpa-max-field-length
。
使用者設定檔更新
此版本包含許多與使用者設定檔相關的修正和更新,因為我們正在努力將此功能從預覽版提升為正式支援。SPI 存在一些小變更,例如在 UserProfileProvider
介面上新增的方法 boolean isEnabled(RealmModel realm)
。此外,一些使用者設定檔類別和一些驗證器相關類別(但不是內建驗證器實作)已從 keycloak-server-spi-private
模組移至 keycloak-server-spi
模組。但是,Java 類別的套件保持不變。您在某些邊緣情況下可能會受到影響,例如當您使用自己的 UserProfileProvider
實作覆寫內建實作時。但是,請注意,UserProfileProvider
是一個不受支援的 SPI。
移除 Map Store
Map Store 在先前的版本中是一個實驗性功能。從此版本開始,它已被移除,使用者應繼續使用目前的 JPA 儲存。
自此版本起,不再可能使用 --storage
相關的 CLI 選項。keycloak-model-map*
模組已移除。
從我們的翻譯中移除命名空間
所有翻譯都移至管理主控台的一個檔案中。如果您已建立自己的翻譯或擴展了管理主控台,則需要將它們遷移至此新格式。此外,如果您的資料庫中有「覆寫」,則必須從金鑰中移除命名空間。某些金鑰是相同的,只是在不同的命名空間中,這對於說明最為明顯。在這些情況下,我們已在金鑰上加上 Help
後綴。
如果您需要,可以使用此節點指令碼來協助遷移。它將會採用所有單一檔案,並將它們放入一個新的檔案中,同時也會處理一些對應
import { readFileSync, writeFileSync, appendFileSync } from "node:fs";
const ns = [
"common",
"common-help",
"dashboard",
"clients",
"clients-help",
"client-scopes",
"client-scopes-help",
"groups",
"realm",
"roles",
"users",
"users-help",
"sessions",
"events",
"realm-settings",
"realm-settings-help",
"authentication",
"authentication-help",
"user-federation",
"user-federation-help",
"identity-providers",
"identity-providers-help",
"dynamic",
];
const map = new Map();
const dup = [];
ns.forEach((n) => {
const rawData = readFileSync(n + ".json");
const translation = JSON.parse(rawData);
Object.entries(translation).map((e) => {
const name = e[0];
const value = e[1];
if (map.has(name) && map.get(name) !== value) {
if (n.includes("help")) {
map.set(name + "Help", value);
} else {
map.set(name, value);
dup.push({
name: name,
value: map.get(name),
dup: { ns: n, value: value },
});
}
} else {
map.set(name, value);
}
});
});
writeFileSync(
"translation.json",
JSON.stringify(Object.fromEntries(map.entries()), undefined, 2),
);
const mapping = [
["common:clientScope", "clientScopeType"],
["identity-providers:createSuccess", "createIdentityProviderSuccess"],
["identity-providers:createError", "createIdentityProviderError"],
["clients:createError", "createClientError"],
["clients:createSuccess", "createClientSuccess"],
["user-federation:createSuccess", "createUserProviderSuccess"],
["user-federation:createError", "createUserProviderError"],
["authentication-help:name", "flowNameHelp"],
["authentication-help:description", "flowDescriptionHelp"],
["clientScopes:noRoles", "noRoles-clientScope"],
["clientScopes:noRolesInstructions", "noRolesInstructions-clientScope"],
["users:noRoles", "noRoles-user"],
["users:noRolesInstructions", "noRolesInstructions-user"],
["clients:noRoles", "noRoles-client"],
["clients:noRolesInstructions", "noRolesInstructions-client"],
["groups:noRoles", "noRoles-group"],
["groups:noRolesInstructions", "noRolesInstructions-group"],
["roles:noRoles", "noRoles-roles"],
["roles:noRolesInstructions", "noRolesInstructions-roles"],
["realm:realmName:", "realmNameField"],
["client-scopes:searchFor", "searchForClientScope"],
["roles:searchFor", "searchForRoles"],
["authentication:title", "titleAuthentication"],
["events:title", "titleEvents"],
["roles:title", "titleRoles"],
["users:title", "titleUsers"],
["sessions:title", "titleSessions"],
["client-scopes:deleteConfirm", "deleteConfirmClientScopes"],
["users:deleteConfirm", "deleteConfirmUsers"],
["groups:deleteConfirm_one", "deleteConfirmGroup_one"],
["groups:deleteConfirm_other", "deleteConfirmGroup_other"],
["identity-providers:deleteConfirm", "deleteConfirmIdentityProvider"],
["realm-settings:deleteConfirm", "deleteConfirmRealmSetting"],
["roles:whoWillAppearLinkText", "whoWillAppearLinkTextRoles"],
["users:whoWillAppearLinkText", "whoWillAppearLinkTextUsers"],
["roles:whoWillAppearPopoverText", "whoWillAppearPopoverTextRoles"],
["users:whoWillAppearPopoverText", "whoWillAppearPopoverTextUsers"],
["client-scopes:deletedSuccess", "deletedSuccessClientScope"],
["identity-providers:deletedSuccess", "deletedSuccessIdentityProvider"],
["realm-settings:deleteSuccess", "deletedSuccessRealmSetting"],
["client-scopes:deleteError", "deletedErrorClientScope"],
["identity-providers:deleteError", "deletedErrorIdentityProvider"],
["realm-settings:deleteError", "deletedErrorRealmSetting"],
["realm-settings:saveSuccess", "realmSaveSuccess"],
["user-federation:saveSuccess", "userProviderSaveSuccess"],
["realm-settings:saveError", "realmSaveError"],
["user-federation:saveError", "userProviderSaveError"],
["realm-settings:validateName", "validateAttributeName"],
["identity-providers:disableConfirm", "disableConfirmIdentityProvider"],
["realm-settings:disableConfirm", "disableConfirmRealm"],
["client-scopes:updateSuccess", "updateSuccessClientScope"],
["client-scopes:updateError", "updateErrorClientScope"],
["identity-providers:updateSuccess", "updateSuccessIdentityProvider"],
["identity-providers:updateError", "updateErrorIdentityProvider"],
["user-federation:orderChangeSuccess", "orderChangeSuccessUserFed"],
["user-federation:orderChangeError", "orderChangeErrorUserFed"],
["authentication-help:alias", "authenticationAliasHelp"],
["authentication-help:flowType", "authenticationFlowTypeHelp"],
["authentication:createFlow", "authenticationCreateFlowHelp"],
["client-scopes-help:rolesScope", "clientScopesRolesScope"],
["client-scopes-help:name", "scopeNameHelp"],
["client-scopes-help:description", "scopeDescriptionHelp"],
["client-scopes-help:type", "scopeTypeHelp"],
["clients-help:description", "clientDescriptionHelp"],
["clients-help:clientType", "clientsClientTypeHelp"],
["clients-help:scopes", "clientsClientScopesHelp"],
["common:clientScope", "clientScopeTypes"],
["dashboard:realmName", "realmNameTitle"],
["common:description", "description"],
];
mapping.forEach((m) => {
const key = m[0].split(":");
try {
const data = readFileSync(key[0] + ".json");
const translation = JSON.parse(data);
const value = translation[key[1]];
if (value) {
appendFileSync(
"translation.json",
'"' + m[1] + '": ' + JSON.stringify(value) + ',\n',
);
}
} catch (error) {
console.error("skipping namespace key: " + key);
}
});
將其儲存到您的 public/locale/<language>
資料夾中名為 transform.mjs
的檔案中,並使用以下命令執行它
node ./transform.mjs
這可能無法完成完整的轉換,但已非常接近。 |
遷移至 22.0.2
從用戶端進階設定組合中移除永不過期選項
永不過期
選項現在已從「進階設定」用戶端索引標籤的所有組合中移除。此選項具有誤導性,因為不同的存留時間或閒置逾時從來都不是無限的,而是受到一般使用者工作階段或 realm 值的限制。因此,此選項已移除,改用其餘的兩個選項:繼承 realm 設定
(用戶端使用一般 realm 逾時)和 在以下時間過期
(該值會覆寫用戶端)。在內部,永不過期
以 -1
表示。現在,該值會在管理主控台中顯示警告,且管理員無法直接設定。
新的 LinkedIn OpenID Connect 社群提供者
已為以商業和就業為重點的平台引入一個名為 LinkedIn OpenID Connect 的新社群身份提供者。LinkedIn 最近發布了一個針對開發人員的新產品,稱為 使用 OpenID Connect 登入 LinkedIn。該產品提供一種使用 OpenID Connect 驗證成員的新方法,但預設的 OpenID Connect v1.0 身份提供者目前無法與其搭配使用。因此,Keycloak 將此新的身份提供者新增為新產品的特定社群提供者。
舊的基於 OAuth 的 LinkedIn 方法似乎已從 開發人員入口網站 中完全移除。現有的 LinkedIn 社群提供者如何與目前的應用程式搭配運作尚不清楚。Keycloak 保留了重新命名為 LinkedIn (已棄用) 的舊提供者,但它在預設停用的 linkedin-oauth 這個已棄用的功能中。它將在未來的版本中移除。如果需要,請在啟動時再次啟用它
kc.[sh|bat] start --features linkedin-oauth ...
遷移至 22.0.0
從 Java EE 過渡到 Jakarta EE
Keycloak 已將其程式碼庫從 Java EE (企業版) 遷移到其後繼版本 Jakarta EE,這為 Keycloak 帶來了各種變更。
我們已升級所有 Jakarta EE 規格,以支援 Jakarta EE 10,例如
-
Jakarta Persistence 3.1
-
Jakarta RESTful Web Services 3.1
-
Jakarta Mail API 2.1
-
Jakarta Servlet 6.0
-
Jakarta Activation 2.1
Jakarta EE 10 提供了一種更現代化、更簡化、更輕量級的方法來建置雲端原生 Java 應用程式。此計畫中提供的主要變更包括將命名空間從 javax.*
變更為 jakarta.*
。它不適用於 JDK 中直接提供的 javax.*
套件,例如 javax.security
、javax.net
、javax.crypto
等。
您的自訂擴充功能、供應商或 JPA 實體可能會受到這些變更的影響。
升級至 Quarkus 3
Keycloak 已升級至 Quarkus Java 框架的第 3 版。Quarkus 3 延續了快速發展並利用最新技術提供尖端使用者體驗的傳統,進一步推動 Java 開發。它持續改善整體效能和效率。
Quarkus 3 基於 Jakarta EE 10,與 Keycloak 相同,兩者之間具有順暢的互通性。此外,它還包含 Eclipse MicroProfile 6,與 Jakarta EE 10 Core Profile 對齊。Quarkus 3 升級的核心是內建支援 JPA 3.1 和 Hibernate ORM 6。
升級至 Hibernate ORM 6
Keycloak 現在受益於升級至 Hibernate ORM 6.2,其中包括效能提升、更好的 SQL、現代 JDK 支援以及對現代 RDBMS 功能的支援。效能提升主要影響 JDBC、HQL 轉換和 Criteria 轉換。
如果您有自訂的供應商或 JPA 實體,這些變更可能會影響您。
我們建議您檢閱 Quarkus 移轉指南 或 Hibernate 版本說明,以取得更多資訊。
從 Keycloak JS 介面卡中移除舊版 Promise API
舊版 Promise API 方法已從 Keycloak JS 介面卡中移除。這表示不再可能在介面卡傳回的 promise 上呼叫 .success()
和 .error()
。相反地,應該使用標準化的 Promise 方法,例如 .then()
和 .catch()
。
const keycloak = new Keycloak();
keycloak.init()
.success(function(authenticated) {
alert(authenticated ? 'authenticated' : 'not authenticated');
}).error(function() {
alert('failed to initialize');
});
const keycloak = new Keycloak();
keycloak.init()
.then(function(authenticated) {
alert(authenticated ? 'authenticated' : 'not authenticated');
}).catch(function() {
alert('failed to initialize');
});
await
關鍵字來解開這些 promise 時const keycloak = new Keycloak();
try {
const authenticated = await keycloak.init();
alert(authenticated ? 'authenticated' : 'not authenticated');
} catch (error) {
alert('failed to initialize');
}
匯出和匯入會執行自動建置
在先前的版本中,export
和 import
命令需要先執行 build
命令。從此版本開始,如果建置時間設定已變更,則 export
和 import
命令會執行 Keycloak 的自動重建。
當移轉先執行 build
命令的現有指令碼時,請將 --optimized
命令列選項新增至 export
和 import
命令,以避免 Keycloak 自動重建映像。未在此新增 --optimized
選項可能會使 Keycloak 觸發重建並還原為預設值,然後連線到資料庫以進行匯出和匯入將無法運作。
以下範例假設執行階段參數(例如資料庫密碼)是透過設定檔或環境變數提供的。
bin/kc.[sh|bat] build --db=postgres ...
bin/kc.[sh|bat] export --dir <dir>
--optimized
新增至匯出命令bin/kc.[sh|bat] build --db=postgres ...
bin/kc.[sh|bat] export --optimized --dir <dir>
bin/kc.[sh|bat] export --dir <dir> --db=postgres ...
- 注意
-
當執行自動建置時,建置時間選項將對所有後續以
--optimized
旗標啟動的命令生效,包括start
命令。
在先前的版本中,export
和 import
命令僅允許在設定檔或環境變數中使用執行階段參數(例如資料庫 URL)。從此版本開始,這些執行階段參數現在也可以在命令列中使用。請使用 --help
選項來了解支援的參數。
重新命名 Keycloak Admin 用戶端成品
升級至 Jakarta EE 後,Keycloak Admin 用戶端的成品已重新命名為更具描述性的名稱,並考量長期維護性。我們仍提供兩個不同的 Keycloak Admin 用戶端,一個具有 Jakarta EE 支援,另一個具有 Java EE 支援。
我們已停止發佈 org.keycloak:keycloak-admin-client-jakarta
成品。具有 Jakarta EE 支援的 Keycloak Admin 用戶端預設成品是 org.keycloak:keycloak-admin-client
(自 22.0.0 版起)。
新的 Java EE 支援成品是 org.keycloak:keycloak-admin-client-jee
。
Passthrough 代理模式變更
Keycloak 針對模式 passthrough 的代理設定不再剖析要求中的 HTTP 轉送標頭,因為當代理在 passthrough 模式中轉送 HTTPS 連線時,代理無法新增、移除或更新 HTTP 標頭。
想要剖析用戶端要求中 HTTP 標頭的安裝應該使用 edge 或 reencrypt 設定。
如需詳細資訊,請參閱 使用反向代理。
所有佈景主題的一致備用訊息解析
當您使用領域本地化訊息時,此變更可能只會影響您。
在此版本之前,當使用領域本地化訊息時,跨佈景主題的備用訊息解析不一致。如需更多資訊,請參閱以下 問題。
現在已針對所有佈景主題統一實作。一般而言,最符合特定語言標籤的訊息具有最高優先順序。如果同時存在領域本地化訊息和佈景主題 i18n 訊息,則領域本地化訊息具有較高的優先順序。總結來說,訊息的優先順序如下(RL = 領域本地化,T = 佈景主題 i18n 檔案):RL <變體> > T <變體> > RL <區域> > T <區域> > RL <語言> > T <語言> > RL en > T en
。
或許可以透過範例更好地說明:當要求變體 de-CH-1996
且該變體存在領域本地化訊息時,將會使用此訊息。如果不存在此類領域本地化訊息,則會搜尋佈景主題 i18n 檔案中是否有對應該變體的訊息。如果不存在此類訊息,則會搜尋區域 (de-CH
) 的領域本地化訊息。如果不存在此類領域本地化訊息,則會搜尋佈景主題 i18n 檔案中是否有對應該區域的訊息。如果仍然找不到訊息,則會搜尋語言 (de
) 的領域本地化訊息。如果沒有相符的領域本地化訊息,則會搜尋佈景主題 i18n 檔案中是否有對應該語言的訊息。最後的備用方案是使用英文 (en
) 翻譯:首先,會搜尋英文領域本地化,如果找不到,則會搜尋佈景主題 i18n 檔案中是否有英文訊息。
UserQueryProvider
變更
UserQueryProvider
介面已分成兩個。一個是 UserQueryMethodsProvider
,提供查詢用戶的功能。第二個是 UserCountMethodsProvider
,提供計算特定儲存中用戶數量的功能。
Keycloak 現在能夠區分可以有效執行計數查詢的用戶儲存供應商和無法執行計數查詢的用戶儲存供應商。UserQueryProvider
介面仍然存在,並延伸兩個新的介面。因此,由於 UserQueryProvider
保留相同的方法,因此現有 UserQueryProvider
實作中不需要進行任何修改。
LDAPStorageProvider
搜尋變更
從此版本開始,Keycloak 在查詢聯合 LDAP 資料庫時使用分頁機制。搜尋用戶應與本機資料庫中的搜尋一致。
自此版本起,LDAPStorageProvider
僅實作 UserQueryMethodsProvider
,而非 UserQueryProvider
。
Keycloak OpenID Connect 介面卡的淘汰
從此版本開始,我們將不再投入時間於以下 Keycloak OpenID Connect 介面卡
-
Keycloak Wildfly OpenID Connect 介面卡
-
Keycloak JEE Servlet OpenID Connect 介面卡
-
Keycloak Spring Boot 和 Spring Security OpenID Connect 介面卡
此變動已反映在我們的文件中和快速入門存放庫中。請考慮查看以下參考資料以取得更多資訊
我們建議您開始研究將您的應用程式移至以上參考資料中的替代方案。這些介面卡在未來的版本中不應再可用。
Keycloak JEE SAML 介面卡的淘汰
Keycloak JEE SAML 介面卡已停止使用,在此版本之後,我們將不再投入時間於其開發。
官方介面卡現在基於 Jakarta,您應該在將應用程式切換至此技術後立即使用它。
此變更已在我們的文件中和快速入門存放庫中。如需更多資訊,請考慮查看以下參考資料
如果您無法將應用程式移轉至 Jakarta,您仍然可以使用「舊版」SAML JEE 介面卡,並且仍然能夠與伺服器的未來版本整合。但是,請盡快考慮升級您的應用程式,因為我們不再提供對 JEE 的支援。
openshift-integration 功能的變更
預覽功能 openshift-integration
已從 Keycloak 程式碼庫中移除,並移至個別的擴充功能。這包括移動相關供應商,例如自訂用戶端儲存供應商和 Openshift 整合的權杖檢閱端點。
如果您使用了此功能,當啟動 Keycloak 伺服器時,您不應再使用 openshift-integration
功能,而是需要部署來自自訂擴充功能的 JAR 檔案。您可以查看 Openshift 擴充功能及其 README 檔案中的說明,瞭解如何將擴充功能部署到您的 Keycloak 伺服器。
Openshift 擴充功能並非 Keycloak 團隊官方支援和維護。您只能自行承擔風險使用它。 |
已移除 Http Challenge 流程
內建的驗證流程 http challenge
以及驗證器實作 no-cookie-redirect
、basic-auth
和 basic-auth-otp
皆已移除。http challenge
驗證流程也旨在用於 Openshift 整合,因此也已與上述其他相關功能一併移除。驗證器實作已移至前段所述的 Openshift 擴充功能中。
如果您將 http challenge
流程用作 realm 流程,或是任何身分提供者的 First Broker Login
或 Post Broker Login
流程,則無法進行遷移。請務必在遷移之前更新您的 realm 設定,以消除 http challenge
流程的使用。如果您將 http challenge
流程用作任何用戶端的 Authentication Flow Binding Override
,則遷移將會完成,但您將無法再登入該用戶端。遷移之後,您需要重新建立該流程並更新用戶端的設定,以使用新的/不同的Json流程。
移除第三方相依性
移除 openshift-integration 允許我們從 Keycloak 發行版中移除一些第三方相依性。這包括 openshift-rest-client
、okio-jvm
、okhttp
、commons-lang
、commons-compress
、jboss-dmr
和 kotlin-stdlib
。這表示如果您使用任何這些程式庫作為部署到 Keycloak 伺服器的自訂提供者的相依性,您可能還需要將這些 jar
檔案明確複製到 Keycloak 發行版的 providers
目錄中。
不再為 JAX-RS 資源啟用上下文和依賴注入
為了提供更好的運行時效能並盡可能利用底層堆疊,所有使用 javax.ws.rs.core.Context
註解的上下文資料注入點都已移除。預期的效能提升包括不再於請求生命週期中多次建立代理實例,並大幅減少運行時的反射程式碼量。
如果您正在擴充下列其中一個 SPI
-
PolicySpi
-
AdminRealmResourceSpi
-
IdentityProviderSpi
-
RealmResourceSPI
您應該檢查您的自訂 JAX-RS (子)資源,以按照以下方式取得任何上下文資料
KeycloakSession session = org.keycloak.common.util.Resteasy.getContextData(KeycloakSession.class);
如果您需要存取目前的請求和回應物件,現在可以直接從 KeycloakSession
取得它們的實例
@Context
org.jboss.resteasy.spi.HttpRequest request;
@Context
org.jboss.resteasy.spi.HttpResponse response;
已由以下取代
KeycloakSession session = // obtain the session, which is usually available when creating a custom provider from a factory
KeycloakContext context = session.getContext();
HttpRequest request = context.getHttpRequest();
HttpResponse response = context.getHttpResponse();
如果您在調用 JAX-RS 資源方法時無法存取 KeycloakSession
實例,您可以從 JAX-RS 運行時取得上下文資料,如下所示
KeycloakSession session = org.keycloak.common.util.Resteasy.getContextData(KeycloakSession.class);
可以透過 KeycloakContext
實例從運行時取得其他上下文資料
KeycloakSession session = // obtain the session
KeycloakContext context = session.getContext();
MyContextualObject myContextualObject = context.getContextObject(MyContextualObject.class);
升級您的自訂 JAX-RS 資源
如果您正在透過下列 SPI 擴充伺服器的 REST API
-
PolicySpi
-
AdminRealmResourceSpi
-
IdentityProviderSpi
-
RealmResourceSPI
您需要在封裝自訂提供者的 JAR 檔案中新增一個空的 META-INF/beans.xml
。否則,它們在運行時將不會被伺服器識別。
如果您使用 RealmResourceSPI
或 AdminRealmResourceSpi
,您可以選擇在 META-INF
下新增一個名為 beans.xml
的空檔案,或使用 jakarta.ws.rs.ext.Provider
註解來註解 JAX-RS 資源類別。
您也應該確保您的 JAX-RS 方法透過使用 @Consumes
和 @Produces
註解來分別宣告輸入和輸出的預期媒體類型。
資料提供者和模型中已棄用的方法
在 Keycloak 的較早版本中,提供者和模型介面經歷了一個清理過程,其中涉及棄用某些方法。在此版本中,這些方法已移除,並棄用了一些額外的方法。來自 Keycloak 21 的這些方法的 Javadoc 包含了有關其對應替換的資訊。
-
已移除
RealmModel#searchForGroupByNameStream(String, Integer, Integer)
。 -
已移除
UserProvider#getUsersStream(RealmModel, boolean)
。 -
已移除
UserSessionPersisterProvider#loadUserSessions(int, int, boolean, int, String)
。 -
為 Streamification 工作新增的介面已移除。例如
RoleMapperModel.Streams
和類似介面。 -
已棄用聯邦式儲存提供者類別中的
Streams
介面。 -
已移除
KeycloakModelUtils#getClientScopeMappings
。 -
已移除
KeycloakSession
中已棄用的方法。 -
已移除
UserQueryProvider#getUsersStream
方法。
多個 Keycloak 實例
可以在同一個命名空間中建立多個 Keycloak CR,並且將由運算子獨立管理。為了允許這樣做,必須重新建立舊版運算子所建立的 StatefulSet。這會在運算子升級時自動發生,並導致少量停機時間。
k8s.keycloak.org/v2alpha1 變更
條件狀態欄位已從布林值變更為字串,以符合標準的 Kubernetes 條件。在 CRD 中,它將暫時表示為接受任何內容,但它只會是一個字串。請確保您對此欄位的任何使用方式都已更新為預期值「True」、「False」或「Unknown」,而不是 true 或 false。
Keycloak 支援 IPv4/IPv6 雙堆疊
Keycloak 支援 IPv4/IPv6 雙堆疊,並且預設可以透過 IPv4 和 IPv6 位址存取。在較舊版本的 Keycloak 中,預設方法是僅使用 IPv4 位址。
如需更多詳細資訊,請參閱使用 IPv4 或 IPv6 設定 Keycloak 伺服器。
遷移至 21.1.0
Javascript 引擎預設在類別路徑上可用
在先前的版本中,當在 Java 17 上使用 Keycloak 和 Javascript 提供者(指令碼驗證器、Javascript 授權原則或 OIDC 和 SAML 用戶端的指令碼協定對應器)時,需要將 javascript 引擎複製到發行版。由於 Nashorn javascript 引擎預設在 Keycloak 伺服器中可用,因此不再需要這樣做。當您部署指令碼提供者時,建議不要將 nashorn 指令碼引擎及其相依性複製到 Keycloak 發行版中。
服務帳戶用戶端預設用戶端 ID 對應器的變更
服務帳戶用戶端
的預設 用戶端 ID
對應器已變更。Token Claim Name
欄位值已從 clientId
變更為 client_id
。client_id
宣告符合 OAuth2 規範
clientId
userSession 註解仍然存在。
Keycloak JS 配接器必須使用 new
運算子來實例化
過去可以透過直接呼叫 Keycloak()
函數來建立 Keycloak JS 配接器的實例
const keycloak = Keycloak();
為了使之與 JavaScript 世界中的現代慣例一致,可以使用 new
運算子來建立實例
const keycloak = new Keycloak();
函數樣式的建構函式已被棄用一段時間,但從這個版本開始,當使用它時,我們將主動記錄棄用訊息。這種樣式的建構函式將在未來版本中移除,因此請務必遷移您的程式碼以使用 new
運算子。
遷移至 21.0.0
Keycloak 使用 Micrometer 來收集指標
Keycloak 提供了一個可選的指標端點,用於匯出 Prometheus 格式的指標。在此版本中,提供此資料的實作已從 SmallRye 切換到 Micrometer,這是 Quarkus 建議的指標程式庫。
由於此變更,指標已重新命名。下表顯示了一些範例。
建議在升級之前檢查變更前後從端點傳回的所有指標,並更新它們在儀表板和警示中的使用方式。
舊指標名稱 | 新指標名稱 |
---|---|
|
|
|
|
|
|
|
|
已棄用 SAML 的 RSA_SHA1 和 DSA_SHA1 演算法
可以在 SAML 配接器、用戶端和身分提供者上設定為 Signature algorithms
的 RSA_SHA1
和 DSA_SHA1
演算法已棄用。我們建議使用基於 SHA256
或 SHA512
的更安全替代方案。此外,在 Java 17 或更高版本上,驗證具有這些演算法的已簽署 SAML 文件或聲明上的簽名無效。如果您使用此演算法,並且使用您的 SAML 文件的其他方在 Java 17 或更高版本上執行,則驗證簽名將無法運作。
可能的解決方法是從檔案 $JAVA_HOME/conf/security/java.security
中 jdk.xml.dsig.secureValidationPolicy
屬性上設定的「不允許的演算法」清單中移除演算法,例如 http://www.w3.org/2000/09/xmldsig#rsa-sha1
或 http://www.w3.org/2000/09/xmldsig#dsa-sha1
。
SAML SP 中繼資料變更
在此版本中,Keycloak 將拒絕解密使用為簽署目的產生的 realm 金鑰所加密的聲明。此變更表示從 IDP 到 SP(Keycloak 作為 SP)的所有加密通訊都將停止運作。
有兩種方法可以使其正常運作
-
使用較新版本的 Keycloak 產生的中繼資料更新 IDP 設定,或者
-
或者,您可以讓 Keycloak 以回溯相容模式執行,使 Keycloak 能與舊版 Keycloak 產生的中繼資料協同運作。您可以使用
-Dkeycloak.saml.deprecated.encryption=true
標記來啟用此模式。請注意,此回溯相容模式計畫將在 Keycloak 24 中移除。
已移除使用者工作階段供應商中已棄用的方法
在 Keycloak 13 中,引入了 UserLoginFailureProvider
,且 UserSessionProvider
中的某些方法被移至該處。UserSessionProvider
中的方法已被棄用,現在已移除。這些方法的 Javadoc 包含相應的替代方法(請參閱 Keycloak 20 版本的 Javadoc)。
使用舊版管理主控台的自訂佈景主題將無法運作
舊版管理主控台在先前的版本中已遭棄用,現在已正式移除。這也表示您使用它作為父佈景主題或從中匯入的自訂佈景主題將無法運作。強烈建議您不要部署這類佈景主題,因為擴充舊版管理主控台已不再適用,且部署這類佈景主題可能會在 Keycloak 中出現問題(至少會在記錄檔中顯示警告或錯誤)。
Curl 已從容器中移除
已修改 Keycloak 容器映像以增強安全性。因此,已移除 curl
和其他 CLI 工具,您可能曾在自訂映像中使用它們。請參閱更新的容器指南,以了解如何處理此變更。
遷移至 20.0.0
H2 版本更新
Keycloak 隨附 H2 資料庫驅動程式,僅供開發之用。由於它僅適用於開發用途,因此絕不應在生產環境中使用。
在此版本中,H2 驅動程式已從 1.x 版升級至 2.x 版。這項變更可能需要在現有的 Keycloak 設定中變更 H2 JDBC URL 或遷移 H2 資料庫檔案。
H2 JDBC URL 的變更
為了讓 Keycloak 使用 H2 2.x 版的 JPA 舊版儲存體執行,JDBC URL 需要 NON_KEYWORDS=VALUE
屬性。
在 Keycloak 初始化 H2 時不帶有額外參數的設定中,Keycloak 會自動附加該屬性。這是開發設定的預設值。
如果 H2 JDBC URL 是在命令列上或在組態檔案中提供,且 JDBC URL 中已包含 NON_KEYWORDS=
屬性,則必須使用 VALUE
關鍵字修改此屬性。
如果 H2 資料庫的連線工廠是在 Keycloak 外部初始化,則該初始化需要處理新增 NON_KEYWORDS
屬性。
如需詳細資訊,請參閱 H2 文件中關於 NON_KEYWORDS
屬性的說明。
H2 資料庫檔案的升級
使用 H2 1.x 版建立的 H2 資料庫基礎檔案不應與 2.x 版搭配使用。
清除現有的 H2 資料庫檔案以從空的資料庫開始,使用 Keycloak 的匯出和匯入功能匯出和匯入領域,或參閱 H2 資料庫專案網站上的遷移注意事項,以了解如何遷移 H2 資料庫內容的詳細資訊。
新版 Keycloak Operator 中的重大變更
為了使用最新版的 Keycloak Operator,需要手動重新安裝和升級您的 CR。沒有自動化的遷移。 |
此版本在 Keycloak CR 中包含以下重大變更
serverConfiguration 自由格式欄位已重新命名
從現在起,它稱為 additionalOptions
。此決策背後的想法是使其更符合 Keycloak Quarkus 發行版本,並實現/保留命名一致性。serverConfiguration
仍然可以用於設定在 Keycloak 自訂資源 (CR) 中沒有宣告的替代方案的選項。一個很好的例子是服務供應商。
已精簡 Ingress 選項
過去,它通常是透過 disableDefaultIngress
屬性定義。我們決定對其稍作澄清,因此從現在起,您可以使用以下結構來控制您的 Ingress 設定
spec:
...
ingress:
enabled: false
已新增 HTTP 選項
與 Ingress 類似,您可以用更好的結構化方式定義多個 HTTP 選項
spec:
...
http:
httpEnabled: true
httpPort: 80
httpsPort: 443
tlsSecret: my-tls-secret
已移除資料供應商和模型中已棄用的方法
在 Keycloak 15 之前,我們清理了供應商和模型介面,其中我們棄用了一些方法。這些方法的 Javadoc 包含相應的替代方法(請參閱 Keycloak 19 版本的 Javadoc)。在此版本中,已移除這些方法。以下是所有已變更類別的清單。
棄用和移除方法最常見的模式如下。
-
串流化 - 介面現在僅包含以串流為基礎的方法。
例如,在
GroupProvider
介面中@Deprecated List<GroupModel> getGroups(RealmModel realm);
已由以下取代
Stream<GroupModel> getGroupsStream(RealmModel realm);
有關串流化工作的更多詳細資訊,請參閱 KEYCLOAK-14011。
-
一致的參數排序 - 方法現在具有嚴格的參數排序,其中
RealmModel
永遠是第一個參數。例如,在
UserLookupProvider
介面中@Deprecated UserModel getUserById(String id, RealmModel realm);
已由以下取代
UserModel getUserById(RealmModel realm, String id)
已變更介面的清單
(o.k.
代表 org.keycloak.
套件)
-
server-spi
模組-
o.k.credential.CredentialInputUpdater
-
o.k.credential.UserCredentialStore
-
o.k.models.ClientProvider
-
o.k.models.ClientSessionContext
-
o.k.models.GroupModel
-
o.k.models.GroupProvider
-
o.k.models.KeyManager
-
o.k.models.KeycloakSessionFactory
-
o.k.models.ProtocolMapperContainerModel
-
o.k.models.RealmModel
-
o.k.models.RealmProvider
-
o.k.models.RoleContainerModel
-
o.k.models.RoleMapperModel
-
o.k.models.RoleModel
-
o.k.models.RoleProvider
-
o.k.models.ScopeContainerModel
-
o.k.models.UserCredentialManager
-
o.k.models.UserModel
-
o.k.models.UserProvider
-
o.k.models.UserSessionProvider
-
o.k.models.utils.RoleUtils
-
o.k.sessions.AuthenticationSessionProvider
-
o.k.storage.client.ClientLookupProvider
-
o.k.storage.group.GroupLookupProvider
-
o.k.storage.user.UserLookupProvider
-
o.k.storage.user.UserQueryProvider
-
-
server-spi-private
模組-
o.k.events.EventQuery
-
o.k.events.admin.AdminEventQuery
-
o.k.keys.KeyProvider
-
所有變更都連結至以下問題。
遷移至 19.0.2
OpenID Connect 登出提示
在 Keycloak 18.0.0 中,登出現在與新的 OIDC 規格相容,該規格變更了 URL 參數的處理方式。但是,為了與先前的版本保持相容性,引入了相容性標記。請參閱升級指南,以取得有關回溯相容性選項的更多資訊,該選項允許您的應用程式繼續使用舊格式的 URL 參數。
雖然現在可以將 URL 參數設定為相容,但與 Keycloak 17 和更早的版本仍然存在一個不相容的問題。如果使用者未提供有效的 idTokenHint
,則會顯示登出提示,而不是成功登出重新導向。因此,引入了一個新的相容性標記 suppress-logout-confirmation-screen
以抑制登出畫面。
當您啟動伺服器時,可以輸入以下命令來啟用此參數
bin/kc.[sh|bat] --spi-login-protocol-openid-connect-suppress-logout-confirmation-screen=true start
透過此設定,您仍然可以在沒有使用者提示的情況下使用登出端點。
回溯相容性開關將在未來的某個版本中移除 - 可能是 Keycloak 23。建議您盡快更新您的用戶端,如上所述,而不是依賴此開關。 |
透過 SAML javascript 通訊協定對應程式部署指令碼
直到現在,在他們的 SAML 用戶端或用戶端範圍上使用 SAML javascript 通訊協定對應程式的管理員,都可以透過 Keycloak 管理主控台以及 RESTful 管理 API 將指令碼上傳至伺服器。
從現在起,此功能已停用,使用者應直接將指令碼部署至伺服器。此行為與其他以指令碼為基礎的供應商一致。如需更多詳細資訊,請參閱 JavaScript 供應商。
UserInfo 端點變更
- 錯誤回應變更
-
UserInfo 端點現在會傳回完全符合 RFC 6750(OAuth 2.0 授權架構:Bearer 權杖用法)的錯誤回應。錯誤碼和描述(如果有的話)是以
WWW-Authenticate
挑戰屬性而不是 JSON 物件欄位提供。回應將如下所示,具體取決於錯誤條件-
如果未提供存取權杖
401 Unauthorized WWW-Authenticate: Bearer realm="myrealm"
-
如果同時使用多種方法來提供存取權杖(例如,授權標頭 + POST access_token 參數),或 POST 參數重複
400 Bad Request WWW-Authenticate: Bearer realm="myrealm", error="invalid_request", error_description="..."
-
如果存取權杖遺失
openid
範圍403 Forbidden WWW-Authenticate: Bearer realm="myrealm", error="insufficient_scope", error_description="Missing openid scope"
-
如果無法解析 UserInfo 回應簽署/加密的密碼編譯金鑰
500 Internal Server Error
-
如果發生權杖驗證錯誤,則會傳回
401 Unauthorized
以及invalid_token
錯誤碼。此錯誤包括使用者和用戶端相關檢查,並且實際上會擷取所有剩餘的錯誤案例401 Unauthorized WWW-Authenticate: Bearer realm="myrealm", error="invalid_token", error_description="..."
-
- 其他變更
-
-
現在要求存取權杖必須包含
openid
範圍 (scope),這是因為 UserInfo 是 OpenID Connect 特有的功能,而非 OAuth 2.0 的功能。如果權杖中缺少openid
範圍,則請求將會被拒絕,並返回403 Forbidden
錯誤(如上所述)。 -
UserInfo 現在會檢查使用者狀態,如果使用者被停用,則會返回
invalid_token
回應。
-
遷移至 19.0.0 版本
新的管理主控台現在是預設主控台
新的管理主控台現在是 Keycloak 的預設主控台。如果您無法開始使用新的管理主控台,可以停用新的主控台,以繼續使用舊的管理主控台,例如透過執行以下命令:
bin/kc.sh start-dev --features-disabled=admin2
繼續使用舊管理主控台的另一種方法是將主領域 (master realm) 或任何其他領域的主題設定為 keycloak
。
由於新的管理主控台與舊的管理主控台有顯著差異,它是基於 React 並使用較新版本的 PatternFly,任何自訂主題都可能需要從頭開始重新實作。要為新的管理主控台建立自訂主題,該主題應擴展 keycloak.v2
而不是 keycloak
。
如果您已明確將主領域或任何其他領域的管理主控台主題設定為 keycloak
,它將繼續使用舊的管理主控台。要更新到新的管理主控台,您需要將主題變更為 keycloak.v2
。
舊的管理主控台將在 Keycloak 21 中移除。
伺服器配置和啟動的變更
在此版本之前,您會在執行 start
命令時使用 --auto-build
,以告知伺服器在啟動伺服器之前,如果有任何建置選項發生變更,則有條件地執行 build
。
在此版本中,--auto-build
標誌已被棄用,您不再需要使用它來表示您希望在啟動伺服器時設定建置選項。相反地,如果任何建置選項發生變更,伺服器預設總是在啟動伺服器之前執行 build
。新的行為透過使其成為可選的(雖然強烈建議),來改善配置和啟動伺服器時的整體體驗,以便在啟動之前執行 build
命令以達到最佳的啟動時間和記憶體佔用量。
現在,為了達到最佳的啟動時間和記憶體佔用量,請設定 --optimized
選項來停用新的預設行為。--optimized
標誌會告知伺服器,作為啟動一部分,不需要檢查和直接執行 build
。
kc.sh start --optimized
如果您已經使用自訂映像來設定建置選項並執行最佳化的 Keycloak 容器,請確保在調用 start
命令時設定 --optimized
選項。
健康檢查端點的潛在重大變更
在 Keycloak 19.0.0 之前,基於 Quarkus 的 Keycloak 發行版本總是會意外地啟用以下非應用程式端點:
-
/q/health
-
/q/health/live
-
/q/health/ready
-
/q/metrics
從 Keycloak 19.0.0 開始,這些端點已被停用,並且請求將導致 404 HTTP 狀態碼。如果您正在使用 /q/…
端點,請務必在升級到 Keycloak 19.0.0 時,將您的探針和監控系統變更為使用預期的健康檢查端點。
預期的健康檢查端點為:
-
/health
-
/health/live
-
/health/ready
-
/metrics
除了停用 /q/ 端點之外,以下是針對健康檢查端點所做的其他改進:
-
用於存活探針的
health/live
端點現在與資料庫連線健康檢查分開,以符合當前良好做法,並且不會與health/ready
端點有相同的行為。因此,當呼叫/health/live
時,資料庫檢查將不再顯示在checks:
陣列中,因此當資料庫發生故障時,存活探針仍會返回 HTTP 狀態碼 200 和 UP 狀態,因此不會觸發 Pod 重新啟動。 -
用於就緒探針的
health/ready
端點仍然會檢查資料庫連線是否正常運作。請確保您的設定不僅有health-enabled=true
,還有metrics-enabled=true
,以啟用資料庫檢查,從而實現有效的就緒探針。當資料庫連線處於不健康狀態時,它會返回 HTTP 狀態碼 503 和 DOWN 狀態。
未來將在此領域進行更多增強。如需更多資訊,請參閱健康檢查指南。
使用 GELF / 集中式日誌管理的變更
如發行說明中所述,Keycloak 現在開箱即用支援集中式日誌系統的 GELF 日誌記錄。
當您在先前版本中自行新增 GELF 相關的 Quarkus JAR 時,請確保切換到日誌記錄指南中支援的配置選項,並從 providers
資料夾中移除您的 JAR。
影響開發人員的變更
Keycloak 正在進行大型重構,這會影響現有程式碼。其中一些變更需要更新現有程式碼。這些變更在下面有更詳細的描述。
變更的理由
Keycloak 有一些限制;例如,升級 Keycloak 叢集需要停機。為了應對這些限制,已開始進行深入的重構。
此版本的變更主要與儲存重構和新的儲存(稱為 Map 儲存)的準備工作有關。此儲存最終將取代目前的儲存,在此版本中將被稱為「傳統儲存」。傳統儲存將在 Keycloak 中再保留幾個版本。
新的儲存強制執行服務層和儲存層之間嚴格的責任分離。因此,服務層對物件來源的可見性將受到限制,因此它將無法區分快取或非快取的物件,或來自本機或聯合儲存的物件。
使用者儲存 SPI 將被棄用。它將在未來幾個版本中繼續支援,但最終將被 Map 儲存 SPI 取代,這將提供為任何已識別的區域建立自訂儲存的能力,例如使用者、角色、用戶端或群組。
依賴於傳統儲存中服務可用的詳細程度的擴充功能,需要在傳統儲存的完整棄用期間進行調整,以保留此功能。以下章節描述如何完成此調整。
使用傳統和 Map 儲存是互斥的;當一個儲存處於活動狀態時,不能使用另一個儲存。
模組結構的變更
作為引入新儲存功能的一部分,KeycloakSession
中圍繞儲存功能的幾個公用 API 已被整合,並且有些已被棄用,將在下一個版本中移除。已引入三個新的模組,並且來自 server-spi
、server-spi-private
和 services
模組的資料導向程式碼已移至這些模組:
org.keycloak:keycloak-model-legacy
-
包含來自傳統儲存的所有公用 API,例如使用者儲存 API。
org.keycloak:keycloak-model-legacy-private
-
包含與使用者儲存管理相關的私人實作,例如儲存
*Manager
類別。 org.keycloak:keycloak-model-legacy-services
-
包含所有直接在傳統儲存上操作,並且在新儲存中沒有意義的 REST 端點。
只要支援傳統儲存,這些模組就將可用。在那段時間之後,它們將被移除。
此變更會影響 Wildfly 發行版本中現有使用者儲存提供者的部署。如果您的使用者儲存提供者是以 WAR 封存部署的,則需要在該封存中新增 META-INF/jboss-deployment-structure.xml
檔案,其中說明修改後的相依性,如下所示:
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
<deployment>
<dependencies>
<module name="org.keycloak.keycloak-model-legacy" meta-inf="import"/>
</dependencies>
</deployment>
</jboss-deployment-structure>
KeycloakSession
中的變更
KeycloakSession
已簡化。KeycloakSession
中有幾個方法已被棄用,並將在未來版本中移除。
KeycloakSession
工作階段包含多個方法,用於取得特定物件類型的提供者,例如對於 UserProvider
,有 users()
、userLocalStorage()
、userCache()
、userStorageManager()
和 userFederatedStorage()
。這種情況可能會讓開發人員感到困惑,因為他們必須了解每個方法的確切含義,並且取決於目前的儲存佈局。新的儲存不會區分聯合儲存和本機儲存。
由於這些原因,只有 users()
方法會保留在 KeycloakSession
中,並且應取代上面列出的所有其他呼叫。其餘的方法已被棄用,並將最終移除。相同的棄用模式適用於其他物件區域的方法,例如 clients()
或 groups()
。現在,當呼叫所有以 *StorageManager()
和 *LocalStorage()
結尾的方法時,都會擲回例外狀況,因為新的儲存中沒有直接的取代項。下一節將描述如何將這些呼叫遷移到新的 API,或在使用舊儲存時使用傳統 API。
KeycloakSession 中已棄用的方法將在未來版本中移除。keycloak-model-legacy-*
模組將在更長的時間內可用,並將最終移除。
遷移不依賴傳統儲存的現有提供者
如果現有的提供者沒有呼叫已棄用的方法,則不需要遷移,大多數提供者都應該如此。
如果提供者使用已棄用的方法,但不依賴本地與非本地儲存,將呼叫從現在已棄用的 userLocalStorage()
方法變更為 users()
方法是最佳選擇。請注意,此處的語意會發生變化,因為如果本地設定中已啟用快取,則新方法會涉及到快取。
session.userLocalStorage();
session.users();
遷移依賴舊版儲存的現有提供者
在極少數情況下,當自訂提供者需要區分特定提供者的模式時,可以使用 LegacyStoreManagers
資料儲存提供者來存取已棄用的物件。只有當舊版模組是部署的一部分時,此選項才可用。
session.userLocalStorage();
((LegacyDatastoreProvider) session.getProvider(DatastoreProvider.class)).userLocalStorage();
為了方便起見,一些使用者儲存相關的 API 已封裝在 org.keycloak.storage.UserStorageUtil
中。
RealmModel
的變更
方法 getUserStorageProviders
、getUserStorageProvidersStream
、getClientStorageProviders
、getClientStorageProvidersStream
、getRoleStorageProviders
和 getRoleStorageProvidersStream
已移除。依賴這些方法且在啟用舊版儲存的情況下執行的程式碼,應將實例轉換如下
realm.getClientStorageProvidersStream()...;
((LegacyRealmModel) realm).getClientStorageProvidersStream()...;
同樣地,過去實作介面 RealmModel
且想要提供這些方法的程式碼,應實作新的介面 LegacyRealmModel
。此介面是 RealmModel
的子介面,並且包含舊方法
public class MyClass extends RealmModel {
/* might not compile due to @Override annotations for methods no longer present
in the interface RealmModel. /
/ ... */
}
public class MyClass extends LegacyRealmModel {
/* ... */
}
介面 UserCache
已移至舊版模組
由於物件的快取狀態對於服務而言是透明的,因此介面 UserCache
已移至模組 keycloak-legacy
。因此,對 session.userCache()
的呼叫只會傳回 UserProvider
,這是一個重大變更。
依賴舊版實作的程式碼應直接存取 UserCache
。雖然在使用舊版儲存進行快取時可能需要這種呼叫,但在使用新的對應儲存時則不需要,因為新的對應儲存會透明地處理快取。
// session.userCache() might return null, null-check omitted for brevity.
session.userCache().evict(realm, user);
// session.getProvider(UserCache.class) might return null, null-check omitted for brevity.
session.getProvider(UserCache.class).evict(realm, user);
若要觸發領域失效,請考慮觸發事件,而不是使用 UserCache
API
UserCache cache = session.getProvider(UserCache.class);
if (cache != null) cache.clear();
session.invalidate(InvalidationHandler.ObjectType.REALM, realm.getId());
使用者的憑證管理
使用者的憑證先前是使用 session.userCredentialManager().method(realm, user, ...)
來管理。新的方式是利用 user.credentialManager().method(...)
。此形式使憑證功能更接近使用者 API,並且不依賴於事先了解使用者憑證在領域和儲存方面的位置。
舊的 API 已棄用,並且只有在部署中啟用舊版儲存時才會運作。新的 API 將與新舊儲存都相容。
session.userCredentialManager().createCredential(realm, user, credentialModel)
user.credentialManager().createStoredCredential(credentialModel)
對於自訂的 UserStorageProvider
,有一個新的方法 credentialManager()
,當傳回 UserModel
時需要實作此方法。由於這些提供者在啟用舊版儲存的環境中執行,因此它們必須傳回 LegacyUserCredentialManager
的實例
UserModel
需要新的方法 credentialManager()
,程式碼將無法編譯public class MyUserStorageProvider implements UserLookupProvider, ... {
/* ... */
protected UserModel createAdapter(RealmModel realm, String username) {
return new AbstractUserAdapter(session, realm, model) {
@Override
public String getUsername() {
return username;
}
};
}
}
UserModel.credentialManager()
。public class MyUserStorageProvider implements UserLookupProvider, ... {
/* ... */
protected UserModel createAdapter(RealmModel realm, String username) {
return new AbstractUserAdapter(session, realm, model) {
@Override
public String getUsername() {
return username;
}
@Override
public SubjectCredentialManager credentialManager() {
return new LegacyUserCredentialManager(session, realm, this);
}
};
}
}
舊版 Keycloak Operator 中已棄用的 podDisruptionBudget
在此版本中,我們已棄用舊版 Keycloak Operator 的 Keycloak CR 中的 podDisruptionBudget
欄位。當 Operator 部署在 Kubernetes 1.25 版或更高版本上時,將會忽略此選用欄位。
作為因應措施,您可以在您的叢集中手動建立 Pod 中斷預算,例如
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
labels:
app: keycloak
name: keycloak
spec:
maxUnavailable: 1
selector:
matchLabels:
component: keycloak
另請參閱Kubernetes 文件。
遷移至 18.0.0
逐步驗證
逐步驗證是一項新功能。此功能提供 acr
用戶端範圍,其中包含一個協定對應器,該對應器應該在權杖中新增 acr
宣告。acr
宣告現在不會像此版本之前那樣自動新增,而是透過使用此用戶端範圍和協定對應器來新增。
用戶端範圍會新增為領域「預設」用戶端範圍,因此將會新增至所有新建立的用戶端。基於效能考量,在遷移期間不會自動將用戶端範圍新增至所有現有用戶端。遷移後,用戶端預設將不會有 acr
宣告。請考慮下列可能的動作
-
如果您不打算使用逐步驗證功能,但您依賴權杖中的
acr
宣告,您可以停用step_up_authentication
功能。如果是一般驗證,則宣告將會以值1
新增,如果是 SSO 驗證,則會以0
新增。 -
透過管理 REST API 或管理主控台手動將
acr
用戶端範圍新增至您的用戶端。如果您想要使用逐步驗證,則特別需要這麼做。如果您的領域中有大量用戶端,並且想要將acr
宣告用於所有用戶端,您可以針對您的資料庫觸發類似此處的一些 SQL。但是,請記得清除快取或重新啟動伺服器 (如果 Keycloak 已啟動)
insert into CLIENT_SCOPE_CLIENT (CLIENT_ID, SCOPE_ID, DEFAULT_SCOPE) select CLIENT.ID as CLIENT_ID, CLIENT_SCOPE.ID as SCOPE_ID, true as DEFAULT_SCOPE
from CLIENT_SCOPE, CLIENT where CLIENT_SCOPE.REALM_ID='test' and CLIENT_SCOPE.NAME='acr' and CLIENT.REALM_ID='test' and CLIENT.PROTOCOL='openid-connect';
OpenID Connect 登出
先前版本的 Keycloak 支援自動登出使用者,並透過開啟登出端點 URL (例如 http(s)://example-host/auth/realms/my-realm-name/protocol/openid-connect/logout?redirect_uri=encodedRedirectUri
) 來重新導向至應用程式。雖然該實作易於使用,但它可能會對效能和安全性產生負面影響。新版本針對基於 OpenID Connect RP 起始登出規格的登出提供更好的支援。不再支援參數 redirect_uri
;此外,在新版本中,使用者需要確認登出。當您包含參數 post_logout_redirect_uri
以及用於登入的 ID 權杖的參數 id_token_hint
時,可以省略確認並自動重新導向至應用程式。
現有的部署會受到下列影響
-
如果您的應用程式直接使用包含
redirect_uri
參數的登出端點連結,您可能需要依照上述說明變更此連結。請考慮完全移除redirect_uri
參數,或將其取代為id_token_hint
和post_logout_redirect_uri
參數。 -
如果您使用 Java 介面卡,並且您的應用程式透過呼叫
httpServletRequest.logout()
登出,則您不會受到影響,因為此呼叫使用登出端點的後通道變體,而後通道變體並未變更。 -
如果您使用最新的 JavaScript 介面卡,您也不會受到影響。但是,如果您的應用程式使用舊版的 JavaScript 介面卡,您就會受到影響,因為此介面卡使用包含已棄用的
redirect_uri
參數的登出端點變體。在這種情況下,您可能需要升級至最新版本的 JavaScript 介面卡。 -
對於 Node.js 介面卡,適用與 JavaScript 介面卡相同的準則。我們建議您更新至最新版本,因為舊版本的介面卡使用已棄用的
redirect_uri
參數。使用最新的 Node.js 介面卡,只要您使用基於/logout
URL 的登出 (如文件或 Node.js 介面卡範例中所述),您就不會受到影響。但是,如果您的應用程式直接使用方法keycloak.logoutUrl
,您可以考慮將idTokenHint
作為此方法的第二個引數新增。在此版本中,新增了將idTokenHint
作為第二個引數的可能性。idTokenHint
需要是在登入期間取得的有效 ID 權杖。新增idTokenHint
是選用的,但如果您省略它,您的使用者將需要確認如先前所述的登出畫面。此外,它們也不會在登出後重新導向回應用程式。
有一個回溯相容性選項,允許您的應用程式仍然使用舊格式的 redirect_uri
參數。
當您啟動伺服器時,可以輸入以下命令來啟用此參數
bin/kc.[sh|bat] --spi-login-protocol-openid-connect-legacy-logout-redirect-uri=true start
透過此配置,您仍然可以使用帶有 redirect_uri
參數的格式。請注意,如果省略 id_token_hint
,則需要確認畫面。
回溯相容性開關將在未來的某個版本中移除 - 可能是 Keycloak 23。建議您盡快更新您的用戶端,如上所述,而不是依賴此開關。 |
移除 upload-scripts
功能
先前版本的 Keycloak 支援透過管理介面(例如管理控制台和 REST API)管理 JavaScript 程式碼。從此版本開始,這已不再可行,您現在應該將您的腳本部署到伺服器,以便配置以下供應商:
-
OpenID Connect 腳本對應器
-
腳本驗證器(驗證執行)
-
JavaScript 政策
有關如何將腳本部署到伺服器的更多詳細資訊,請參閱文件。請注意,要使用腳本,您仍然需要啟用 scripts
技術預覽功能。
kc.[sh|bat] start --auto-build --features=preview
部署腳本時,伺服器會自動建立其對應的供應商,以便您在配置驗證流程、對應器和授權政策時選擇它們。
一般來說,更新您 realm 的步驟如下:
-
在升級之前,移除您正在使用的任何腳本供應商。
-
升級後,按照文件中的說明部署您的腳本。
-
更新您的驗證流程、對應器和客戶端授權設定,以使用從部署到伺服器的腳本建立的供應商。
帳戶控制台 Patternfly 升級
Patternfly (PF) React 函式庫已更新,@patternfly/react-core
從 v3.153.3 更新到 v4.147.0,@patternfly/react-icons
從 v3.15.16 更新到 v 4.11.8,以及 @patternfly/react-styles
從 v3.7.14 更新到 v4.11.8。進行了一些小的 UI 更新,使帳戶控制台與 PF 設計標準保持一致。
由於 PF 中有重大變更,自訂開發的帳戶 UI 可能與這些更新不相容。大多數重大變更應該可以透過更新 PF 元件上的屬性來解決。
資源
-
[Patternfly 文件](https://www.patternfly.org)
已知有重大變更的元件
-
Alert
-
action
屬性變更為actionClose
-
Expandable
-
重新命名為
ExpandableSection
-
Title
-
size 屬性現在使用
TitleSizes
-
DataListContent
-
noPadding
變更為hasNoPadding
-
Grid、Stack、Level、Gallery
-
gutter
屬性變更為hasGutter
-
Modal
-
大小控制已變更,例如,從
isLarge
變更為使用ModalVariant
,例如variant={ModalVariant.large}
-
Select
-
ariaLabelTypeAhead
變更為typeAheadAriaLabel
-
isExpanded
變更為isOpen
-
ariaLabelledBy
變更為aria-labelledby
-
DataListContent
-
noPadding
變更為hasNoPadding
遷移至 17.0.0
預設發行版現在由 Quarkus 提供支援
Keycloak 的預設發行版現在由 Quarkus 提供支援,這為您配置 Keycloak 和部署自訂供應商帶來了一些重大變更。如需更多資訊,請參閱Quarkus 遷移指南。
Keycloak 的 WildFly 發行版現在已被棄用,支援將於 2022 年 6 月結束。我們建議盡快遷移至 Quarkus 發行版。但是,如果您需要在一段時間內繼續使用舊版 WildFly 發行版,則需要考慮一些變更:
-
舊版發行標籤的容器映像已變更。若要使用舊版發行版,請使用標籤
legacy
或17.0.0-legacy
。 -
網站上舊版發行版的下載已變更為
keycloak-legacy-17.0.0.[zip|tar.gz]
。
如果您在遷移至 Quarkus 發行版時遇到問題、缺少配置某些內容的能力,或有一般想法和回饋,請在 GitHub Discussions 中開啟討論。
從預覽 Quarkus 發行版遷移
自從 Keycloak 15.1.0 中發布預覽 Quarkus 發行版以來,許多事情都發生了變化。了解變更的理想方式是查看新的伺服器指南。總而言之,變更包括:
-
容器現在發布到
quay.io/keycloak/keycloak:latest
和quay.io/keycloak/keycloak:17.0.0
-
網站上的下載已重新命名為
keycloak-17.0.0.[zip|tar.gz]
。 -
conf/keycloak.properties
已變更為conf/keycloak.conf
,這統一了組態檔和 CLI 引數之間的組態鍵。 -
建置選項
和執行階段組態
之間更清晰的分隔。 -
自訂 Quarkus 組態透過
conf/quarkus.properties
完成。 -
h2-mem
和h2-file
資料庫已重新命名為dev-mem
和dev-file
。 -
現在使用
--features
和--features-disabled
來啟用/停用功能,取代了先前為每個功能使用單獨組態鍵的方法。 -
執行階段組態不再可以傳遞給
kc.[sh|bat] build
,並且不再保存在建置中 -
現在使用
--log-level
和--log-format
來配置記錄層級和格式,而過去這些必須使用不受支援的 Quarkus 屬性來配置。
客戶端政策遷移:client-scopes
如果您使用了包含 client-scopes 條件的政策並直接編輯 JSON 文件,則需要在 JSON 文件中將「scope」欄位名稱變更為「scopes」。
Liquibase 升級至版本 4.6.2
Liquibase 從版本 3.5.5 更新到 4.6.2,其中包括(除其他外)多個錯誤修復,以及使用 ServiceLoader
註冊自訂擴充功能的新方式。
從先前的 Keycloak 版本遷移到 Keycloak 17.0.0 已使用所有目前支援的資料庫進行了廣泛測試,但我們想強調務必仔細遵循升級指南,特別是在升級之前備份現有的資料庫。儘管我們盡力測試了 Liquibase 升級的後果,但某些安裝可能正在使用我們不知道的特定設定。
遷移至 16.0.0
WildFly 25 升級
WildFly 25 棄用了舊版的安全子系統,該子系統用於配置 TLS 等。由於變更量很大,我們無法像過去那樣提供遷移腳本。
我們建議您不要複製先前版本 Keycloak 中的組態檔,而是從 Keycloak 16 中提供的預設組態檔開始,並套用相關的變更。
可以直接複製 Keycloak 子系統的組態。
有關 Elytron 子系統的更多資訊,請參閱WildFly 文件。
對於由此造成的不便,我們深感抱歉,並理解這將使每個人升級到 Keycloak 16 變得更加困難,但我們確實沒有找到替代方法。
值得指出的一件事是切換到 Quarkus 發行版,我們計劃在 Keycloak 17 中完全支援該發行版,這將使配置和升級 Keycloak 變得更加容易。
有關 WildFly 25 的更多資訊,請參閱WildFly 25 發行說明。
Proxy 環境變數
Keycloak 現在會遵循標準的 HTTP_PROXY
、HTTPS_PROXY
和 NO_PROXY
環境變數來處理傳出的 HTTP 要求。如果您定義了 HTTP_PROXY
變數,但未在 SPI 組態中指定明確的 Proxy 對應,此變更可能會導致意外使用 Proxy 伺服器。若要防止 Keycloak 使用這些環境變數,您可以明確地為所有要求建立一個無 Proxy 路由:.*;NO_PROXY
。
移轉至 13.0.0
需要手動移轉步驟
當 standalone.xml 包含任何 SmallRye 模組的參考時,需要手動變更。SmallRye 模組已從底層 WildFly 發行版本中移除,如果組態參考它們,伺服器將無法啟動。因此,如果 standalone.xml
中的組態參考這些模組,則透過 migrate-standalone.cli
進行的伺服器組態移轉會在對組態進行任何變更之前失敗。在這種情況下,要執行伺服器組態移轉,您必須手動移除所有參考 SmallRye 模組的行。在預設組態中,您需要特別移除以下幾行
<extension module="org.wildfly.extension.microprofile.config-smallrye"/>
<extension module="org.wildfly.extension.microprofile.health-smallrye"/>
<extension module="org.wildfly.extension.microprofile.metrics-smallrye"/>
<subsystem xmlns="urn:wildfly:microprofile-config-smallrye:1.0"/>
<subsystem xmlns="urn:wildfly:microprofile-health-smallrye:2.0" security-enabled="false" empty-liveness-checks-status="${env.MP_HEALTH_EMPTY_LIVENESS_CHECKS_STATUS:UP}" empty-readiness-checks-status="${env.MP_HEALTH_EMPTY_READINESS_CHECKS_STATUS:UP}"/>
<subsystem xmlns="urn:wildfly:microprofile-metrics-smallrye:2.0" security-enabled="false" exposed-subsystems="*" prefix="${wildfly.metrics.prefix:wildfly}"/>
升級至 Wildfly 23
Keycloak 伺服器已升級為使用 Wildfly 23 作為底層容器。這不會直接涉及任何特定的 Keycloak 伺服器功能,但請注意以下與移轉相關的變更
- 相依性更新
-
相依性已更新為 Wildfly 23 伺服器使用的版本。例如,Infinispan 現在為
11.0.9.Final
。 - 組態變更
-
standalone(-ha).xml
和domain.xml
檔案中存在一些組態變更。您應遵循下載 Keycloak 伺服器章節來自動處理組態檔案的移轉。不過,以下是一些最重要的變更,如果您自行進行了組態變更,可能需要這些變更-
Infinispan 快取容器的
module
屬性現在已棄用(未使用),並由modules
屬性取代,表示與此快取容器組態相關聯的模組集合。此外,由於使用了 Wildfly 23 作為底層容器,各種元素的屬性也發生了額外的變更。例如,managed-executor-service
和managed-scheduled-executor-service
元素現在可識別新的hung-task-termination-period
屬性。請參閱Wildfly 23 完整模型參考以取得詳細資訊。
-
升級至 Wildfly 22
Keycloak 伺服器已升級為使用 Wildfly 22 作為底層容器。這不會直接涉及任何特定的 Keycloak 伺服器功能,但請注意以下與移轉相關的變更
- 相依性更新
-
相依性已更新為 Wildfly 22 伺服器使用的版本。例如,Infinispan 現在為
11.0.8.Final
。 - 組態變更
-
standalone(-ha).xml
和domain.xml
檔案中存在一些組態變更。您應遵循下載 Keycloak 伺服器章節來自動處理組態檔案的移轉。不過,以下是一些最重要的變更,如果您自行進行了組態變更,可能需要這些變更-
Eclipse MicroProfile Config、Eclipse MicroProfile Health 和 Eclipse MicroProfile Metrics 子系統已由 WildFly 健康子系統 和 WildFly 基礎指標子系統取代。
-
預設的 Wildfly 組態現在可使用 Elytron 自動產生自我簽署憑證。有關詳細資訊,請參閱專用的
applicationSSC
伺服器 SSL 環境定義章節。
-
移轉至 12.0.2
唯讀屬性
已新增對唯讀使用者屬性的支援。這包括不應由使用者或管理員在透過 REST API 或 Keycloak 使用者介面更新使用者時編輯的使用者屬性。如果您使用以下功能,這可能會很重要
-
自訂使用者儲存供應商
-
自訂驗證器
-
自訂 JavaScript 授權原則,根據某些使用者屬性建立授權
-
X.509 驗證器,具有用於將 X.509 憑證對應至使用者身分識別的自訂屬性
-
任何其他自訂功能,其中某些使用者屬性被用作儲存驗證/授權/身分識別環境定義的中繼資料,而不是簡單的使用者個人資料資訊。
請參閱威脅模型緩解章節中的詳細資訊。
移轉至 13.0.0
升級至 Wildfly 22
Keycloak 伺服器已升級為使用 Wildfly 22 作為底層容器。這不會直接涉及任何特定的 Keycloak 伺服器功能,但有一些與移轉相關的變更值得一提。
- 相依性更新
-
相依性已更新為 Wildfly 22 伺服器使用的版本。例如,Infinispan 現在為
11.0.8.Final
。 - 組態變更
-
standalone(-ha).xml
和domain.xml
檔案中存在一些組態變更。您應遵循下載 Keycloak 伺服器章節來自動處理組態檔案的移轉。如果需要更多詳細資訊,例如,您自己進行了一些組態變更,則以下列出最重要的變更-
Eclipse MicroProfile Config、Eclipse MicroProfile Health 和 Eclipse MicroProfile Metrics 子系統已由 WildFly 健康子系統 和 WildFly 基礎指標子系統取代。
-
預設的 Wildfly 組態現在可使用 Elytron 自動產生自我簽署憑證。有關詳細資訊,請參閱專用的
applicationSSC
伺服器 SSL 環境定義章節。
-
移轉至 12.0.0
升級至 Wildfly 21
Keycloak 伺服器已升級為使用 Wildfly 21 作為底層容器。這不會直接涉及任何特定的 Keycloak 伺服器功能,但請注意以下與移轉相關的變更
- 相依性更新
-
相依性已更新為 Wildfly 21 伺服器使用的版本。例如,Infinispan 現在為 11.0.4.Final。
- 組態變更
-
standalone(-ha).xml
和domain.xml
檔案中存在一些組態變更。您應遵循下載 Keycloak 伺服器章節來自動處理組態檔案的移轉。不過,以下是一些最重要的變更,如果您自行進行了組態變更,可能需要這些變更-
Infinispan 快取的
object-memory
元素現在已棄用(未使用),並由heap-memory
元素取代。
-
略過 Docker 通訊協定驗證的使用者工作階段建立
使用 Docker 通訊協定成功驗證後,不會建立使用者工作階段。如需詳細資訊,請參閱伺服器管理指南。
升級至 PatternFly 4
Keycloak 登入佈景主題元件已升級至 PatternFly 4。舊的 PatternFly 3 與新的同時執行,因此可以保留 PF3 元件。但是,登入佈景主題的設計進行了一些變更。請將您的自訂登入佈景主題升級為它們。可以在 keycloak/examples/themes/theme/sunrise
目錄中找到包含必要變更的範例。無需額外設定。
預設情況下,用戶端憑證授權不使用重新整理權杖
從這個 Keycloak 版本開始,OAuth2 用戶端憑證授權端點預設不會發出重新整理權杖。此行為符合 OAuth2 規格。此變更的副作用是,在成功完成用戶端憑證驗證後,Keycloak 伺服器端不會建立使用者工作階段,從而提高了效能並減少了記憶體消耗。建議使用用戶端憑證授權的用戶端停止使用重新整理權杖,而是在每次請求時都使用 grant_type=client_credentials
進行驗證,而不是使用 refresh_token
作為授權類型。與此相關的是,Keycloak 支援在 OAuth2 撤銷端點中撤銷存取權杖,因此如果需要,允許用戶端撤銷個別存取權杖。
為了向後相容性,可以使用舊版本的行為。當使用此設定時,在成功使用用戶端憑證授權進行驗證後,仍會發出重新整理權杖,並且也會建立使用者工作階段。可以在 Keycloak 管理主控台的用戶端詳細資料中,在具有 OpenID Connect Compatibility Modes
的區段中使用 Use Refresh Tokens For Client Credentials Grant
開關來為特定用戶端啟用此功能。
移轉至 11.0.0
升級至 Wildfly 20
Keycloak 伺服器已升級為使用 Wildfly 20 作為底層容器。這不會直接涉及任何特定的 Keycloak 伺服器功能,但請注意以下與移轉相關的變更
- 相依性更新
-
相依性已更新為 Wildfly 20 伺服器使用的版本。例如,Infinispan 現在為 10.1.8.Final。
- 組態變更
-
standalone(-ha).xml
和domain.xml
檔案中存在一些組態變更。您應遵循下載 Keycloak 伺服器章節來自動處理組態檔案的移轉。 - 跨資料中心複寫變更
-
-
您需要將 Infinispan 伺服器升級到 9.4.19 版本。較舊的版本可能仍然有效,但不保證,因為它們不再經過測試。
-
建議在設定 Infinispan 快取時使用新增至
remote-store
元素的protocolVersion
屬性。連線至 Infinispan 伺服器 9.4.18 時,建議的 hotrod 通訊協定版本為 2.9,因為 Keycloak 伺服器和 Infinispan 伺服器之間的 Infinispan 程式庫版本不同。如需更多詳細資訊,請參閱跨資料中心文件。 -
建議在
connectionsInfinispan
子系統下使用remoteStoreSecurityEnabled
屬性。如需更多詳細資訊,請參閱跨資料中心文件。
-
LDAP 無匯入錯誤修復
在先前的 Keycloak 版本中,當 LDAP 提供者設定為「關閉匯入使用者」(Import Users
OFF)時,即使變更了一些非 LDAP 對應的屬性,仍然可以更新使用者。這種情況導致混淆的行為,屬性看起來似乎已更新,但實際上並未更新。在目前版本中,如果變更了任何非 LDAP 對應的屬性,則完全不允許執行更新。
這應該不會影響大多數的部署,但在一些罕見的情況下,某些部署可能會受到影響。例如,如果您先前嘗試使用管理 REST API 更新使用者,而該使用者有一些不正確的屬性變更,則更新是可能的。在目前版本中,更新是不可能的,並且您會立即收到相關原因的通知。
UserModel 變更
UserModel
中的欄位 username
、email
、firstName
和 lastName
已遷移至自訂屬性,以便在即將推出的版本中為 Keycloak 新增更複雜的使用者設定檔。如果資料庫包含具有這些確切名稱的自訂屬性的使用者,則需要在升級之前遷移這些自訂屬性。此遷移不會自動發生。否則,將不再從資料庫中讀取這些屬性,並且可能會被刪除。這種情況意味著現在也可以透過 UserModel.getFirstAttribute(UserModel.USERNAME)
來存取和設定 username
。其他欄位也有類似的含義。直接或間接子類化 UserModel
的 SPI 實作者應確保 setUsername
和 setSingleAttribute(UserModel.USERNAME, …)
(以及其他欄位的類似情況)之間的行為一致。如果策略評估功能的使用者在其評估中使用屬性數量,則必須調整其策略,因為每個使用者現在預設都會有四個新的屬性。
UserModel
的公開 API 並未變更。不需要對前端資源或存取使用者資料的 SPI 進行任何變更。此外,資料庫尚未變更。
Instagram IdP 遷移至新的 API
Instagram IdP 現在使用新的 API,因為舊的傳統 API 已被棄用。這需要取得新的 API 憑證。有關詳細資訊,請參閱伺服器管理指南。
對於使用 Instagram IdP 的現有使用者,尤其是那些只有此驗證選項的使用者,需要特別注意。這些使用者必須在 2020 年 9 月 30 日之前使用 Instagram IdP 登入 Keycloak。在那天之後,他們必須使用不同的驗證方法(例如密碼)登入,才能手動更新他們的 Instagram 社群連結,或在 Keycloak 中建立一個新的帳戶。這是因為 Instagram 使用者 ID 在舊的和新的 API 之間不相容,但是新的 API 會暫時傳回新舊的使用者 ID 以便進行遷移。一旦使用者登入,Keycloak 會自動遷移 ID。
移除非標準權杖內省端點
在先前的版本中,Keycloak 公告了兩個內省端點:token_introspection_endpoint
和 introspection_endpoint
。後者是 RFC-8414 定義的端點。前者先前已棄用,現在已被移除。
遷移至 9.0.1
JavaScript 轉接器中的傳統 Promise
不再需要在 JavaScript 轉接器中設定 promiseType,並且兩者同時可用。建議盡快更新應用程式以使用原生 Promise API (then
和 catch
),因為傳統 API (success
和 error
) 將會在某個時間點移除。
重複的頂層群組
9.0.1 版本修正了一個可能會在領域中建立重複頂層群組的問題。然而,先前重複群組的存在會導致升級程序失敗。如果 Keycloak 伺服器使用 H2、MariaDB、MySQL 或 PostgreSQL 資料庫,則可能會受到此問題的影響。在啟動升級之前,請檢查伺服器是否包含重複的頂層群組。例如,可以在資料庫層級執行以下 SQL 查詢來列出它們
SELECT REALM_ID, NAME, COUNT(*) FROM KEYCLOAK_GROUP WHERE PARENT_GROUP is NULL GROUP BY REALM_ID, NAME HAVING COUNT(*) > 1;
在每個領域中,只能有一個具有相同名稱的頂層群組。在升級之前,應檢查並刪除重複項。升級中的錯誤包含訊息 Change Set META-INF/jpa-changelog-9.0.1.xml::9.0.1- KEYCLOAK-12579-add-not-null-constraint::keycloak failed.
遷移至 8.0.2
更多驗證流程變更
- 在同一流程中不支援 REQUIRED 和 ALTERNATIVE 執行
-
在先前的版本中,可以在同一驗證流程中的相同層級擁有 REQUIRED 和 ALTERNATIVE 執行。這種方法存在一些問題,並且我們在驗證 SPI 中進行了重構,這表示此方法不再被視為有效。如果在相同層級設定了 ALTERNATIVE 和 REQUIRED 執行,則 ALTERNATIVE 執行會被視為停用。因此,當遷移到最新版本時,您現有的驗證流程將會自動遷移,並保留與先前版本相同的行為。如果它們在與某些 REQUIRED 執行相同的層級包含 ALTERNATIVE 執行,則 ALTERNATIVE 執行將會新增到單獨的 REQUIRED 子流程中。這應確保特定驗證流程的行為與先前版本相同/相似。我們始終建議仔細檢查您的驗證流程的組態,並進行測試以仔細檢查一切是否按預期工作。如果您有一些更客製化的驗證流程,包含自訂驗證器實作,則此建議尤其適用。
遷移至 8.0.0
升級至 Wildfly 18
Keycloak 伺服器已升級為使用 Wildfly 18 作為底層容器。這不直接涉及任何特定的 Keycloak 伺服器功能,但是,請注意與遷移相關的這些變更
- 相依性更新
-
相依性已更新為 Wildfly 18 伺服器使用的版本。例如,Infinispan 現在是 9.4.16.Final。
- 組態變更
-
standalone(-ha).xml
和domain.xml
檔案中存在一些組態變更。您應遵循下載 Keycloak 伺服器章節來自動處理組態檔案的移轉。 - 跨資料中心複寫變更
-
-
您需要將 Infinispan 伺服器升級到 9.4.19 版。較舊的版本可能仍然可以使用,但由於我們不再測試,因此不保證其功能。
-
將腳本部署到伺服器
直到現在,管理員仍然可以透過 Keycloak 管理主控台以及 RESTful 管理 API 將腳本上傳到伺服器。
從現在開始,此功能預設為停用,使用者應優先選擇直接將腳本部署到伺服器。有關更多詳細資訊,請參閱JavaScript 提供者。
驗證流程變更
我們針對驗證流程進行了一些重構和改進,這需要在遷移期間注意。
- 移除 OPTIONAL 執行需求
-
關於遷移,最重要的變更是從驗證執行中移除對 OPTIONAL 需求的支援,並將其替換為 CONDITIONAL 需求,這允許更大的彈性。先前版本中設定的現有 OPTIONAL 驗證器會被替換為 CONDITIONAL 子流程。這些子流程將
Condition - User Configured
條件設定為第一個執行,並將先前 OPTIONAL 驗證器(例如OTP Form
)設定為第二個執行。從使用者的角度來看,驗證期間的行為與先前版本相同。 - Java SPI 中的變更
-
Java 驗證 SPI 和憑證提供者 SPI 中存在一些變更。
Authenticator
介面沒有變更,但是如果您正在開發引入一些新憑證類型(CredentialModel
的子類別)的更進階的驗證器,則可能會受到影響。CredentialProvider
介面上有一些變更,並且引入了一些新介面,例如CredentialValidator
。如果您的驗證器支援 OPTIONAL 執行需求,您也可能會受到影響。建議仔細檢查伺服器開發指南中的最新驗證範例,以瞭解更多詳細資訊。 - Freemarker 範本變更
-
Freemarker 範本中存在一些變更。如果您有自己的主題,其中包含用於登入表單或一些帳戶表單的自訂 Freemarker 範本,尤其是與 OTP 相關的表單,則可能會受到影響。建議仔細檢查最新 Keycloak 中的 Freemarker 範本變更,並根據其調整您的範本。
遷移至 7.0.0
升級至 Wildfly 17
Keycloak 伺服器已升級為使用 Wildfly 17 作為底層容器。這不直接涉及任何特定的 Keycloak 伺服器功能,但是,請注意與遷移相關的這些變更
- 相依性更新
-
相依性已更新為 Wildfly 17 伺服器使用的版本。例如,Infinispan 現在是 9.4.14.Final。
- 組態變更
-
standalone(-ha).xml
和domain.xml
檔案中存在一些組態變更。您應遵循下載 Keycloak 伺服器章節來自動處理組態檔案的移轉。 - 跨資料中心複寫變更
-
-
您需要將 Infinispan 伺服器升級到 9.4.19 版。較舊的版本可能仍然可以使用,但由於我們不再測試,因此不保證其功能。
-
遷移至 6.0.0
升級至 Wildfly 16
Keycloak 伺服器已升級為使用 Wildfly 16 作為底層容器。這不直接涉及任何特定的 Keycloak 伺服器功能,但是,請注意與遷移相關的這些變更
- 相依性更新
-
相依性已更新為 Wildfly 16 伺服器使用的版本。例如,Infinispan 現在是 9.4.8.Final。
- 組態變更
-
standalone(-ha).xml
和domain.xml
檔案中存在一些組態變更。您應遵循下載 Keycloak 伺服器章節來自動處理組態檔案的移轉。 - 跨資料中心複寫變更
-
-
您需要將 Infinispan 伺服器升級到 9.4.19 版。較舊的版本可能仍然可以使用,但由於我們不再測試,因此不保證其功能。
-
新的選用客戶端範圍
我們新增了一個新的 microprofile-jwt
選用客戶端範圍,以處理 MicroProfile/JWT 驗證規格中定義的宣告。這個新的客戶端範圍定義了協定對應器,將已驗證使用者的使用者名稱設定為 upn
宣告,並將領域角色設定為 groups
宣告。
能夠將 prompt=none 傳播到預設 IDP
我們在 OIDC 身分提供者組態中新增了一個名為「接受來自客戶端的 prompt=none 轉送」的新開關,以識別能夠處理包含 prompt=none
查詢參數的轉送請求的 IDP。
直到目前為止,當收到 prompt=none
的授權請求時,如果使用者未在 realm 中驗證,realm 會返回 login_required
錯誤,而不會檢查使用者是否已由 IDP 驗證。從現在開始,如果可以為授權請求確定預設 IDP(透過使用 kc_idp_hint
查詢參數或為 realm 設定預設 IDP),並且 IDP 已啟用「接受來自用戶端的 prompt=none 轉發」開關,則授權請求會轉發到 IDP 以檢查使用者是否已在那裡驗證。
請務必注意,此開關僅在指定預設 IDP 時才會被考慮,在這種情況下,我們知道將授權請求轉發到哪裡,而無需提示使用者選擇 IDP。如果無法確定預設 IDP,我們無法假設將使用哪個 IDP 來滿足授權請求,因此不會執行請求轉發。
遷移至 5.0.0
升級至 Wildfly 15
Keycloak 伺服器已升級為使用 Wildfly 15 作為底層容器。這不直接涉及任何特定的 Keycloak 伺服器功能,但是,請注意與遷移相關的這些變更
- 相依性更新
-
相依性已更新為 Wildfly 15 伺服器使用的版本。例如,Infinispan 現在是 9.4.3.Final。
- 組態變更
-
standalone(-ha).xml
和domain.xml
檔案中存在一些組態變更。您應遵循下載 Keycloak 伺服器章節來自動處理組態檔案的移轉。 - 跨資料中心複寫變更
-
-
您需要將 Infinispan 伺服器升級到 9.4.19 版。較舊的版本可能仍然可以使用,但由於我們不再測試,因此不保證其功能。
-
遷移至 4.8.2
Google 身分提供者已更新為使用 Google 登入驗證系統
Keycloak 4.8.1 版本之前的 Google 身分提供者實作依賴 Google+ API 端點進行授權和獲取使用者設定檔。從 2019 年 3 月開始,Google 將取消對 Google+ API 的支援,轉而支援新的 Google 登入驗證系統。Keycloak 身分提供者已更新為使用新的端點,因此如果正在使用此整合,請確保您升級到 Keycloak 4.8.2 或更高版本。
如果您遇到錯誤,指出在目錄中找不到應用程式識別碼,您將必須在 Google API Console 入口網站中重新註冊用戶端應用程式,以獲取新的應用程式 ID 和密碼。
您可能需要調整自訂對應器,以處理 Google+ 使用者資訊端點提供的非標準宣告,這些宣告在 Google 登入 API 中使用不同的名稱提供。請查閱 Google 文件,以獲取有關可用宣告的最新資訊。
LinkedIn 社群代理程式已更新為 LinkedIn API 的第 2 版
根據 LinkedIn 的說法,所有開發人員都需要遷移到其 API 的 2.0 版和 OAuth 2.0。因此,我們已更新我們的 LinkedIn 社群代理程式。
使用此代理程式的現有部署可能會在使用 LinkedIn API 的第 2 版擷取使用者設定檔時開始遇到錯誤。此錯誤可能與用於配置代理程式的用戶端應用程式缺少權限有關,該應用程式可能未被授權存取設定檔 API 或在驗證過程中請求特定的 OAuth2 範圍。
即使是新建立的 LinkedIn 用戶端應用程式,您也需要確保該用戶端能夠請求 r_liteprofile
和 r_emailaddress
OAuth2 範圍(至少),以及該用戶端應用程式可以從 https://api.linkedin.com/v2/me
端點擷取目前成員的設定檔。
由於 LinkedIn 對於存取成員資訊的隱私限制,以及目前成員設定檔 API 返回的宣告集合有限,LinkedIn 社群代理程式現在使用成員的電子郵件地址作為預設使用者名稱。這意味著在驗證期間傳送授權請求時,始終會設定 r_emailaddress
。
遷移至 4.6.0
新的預設用戶端範圍
我們新增了新的 realm 預設用戶端範圍 roles
和 web-origins
。這些用戶端範圍包含協定對應器,可將使用者的角色和允許的網頁來源新增至權杖。在遷移期間,這些用戶端範圍應自動新增到所有 OpenID Connect 用戶端作為預設用戶端範圍。因此,在資料庫遷移完成後,不需要進行任何設定。
協定對應器 SPI 新增
與此相關,(不受支援的) 協定對應器 SPI 存在一個小的新增。只有在您實作自訂 ProtocolMapper 時才會受到影響。ProtocolMapper 介面上引入了一個新的 getPriority()
方法。該方法具有預設實作設定為返回 0。如果您的協定對應器實作依賴於存取權杖 realmAccess
或 resourceAccess
屬性中的角色,您可能需要提高對應器的優先順序。
受眾解析
對於所有已驗證的使用者在權杖中至少有一個用戶端角色的用戶端,其受眾現在會自動新增到存取權杖中的 aud
宣告中。另一方面,存取權杖可能不會自動包含發出該權杖的前端用戶端的受眾。請閱讀伺服器管理指南以瞭解更多詳細資訊。
JavaScript 轉接器 promise
若要將原生 JavaScript promise 與 JavaScript 轉接器一起使用,現在需要在初始化選項中將 promiseType
設定為 native
。
過去,如果原生 promise 可用,則會返回一個包裝器,該包裝器同時提供舊版的 Keycloak promise 和原生 promise。這會導致問題,因為錯誤處理常式並非總是在原生錯誤事件之前設定,這會導致 Uncaught (in promise)
錯誤。
Microsoft 身分提供者已更新為使用 Microsoft Graph API
Keycloak 4.5.0 版本之前的 Microsoft 身分提供者實作依賴 Live SDK 端點進行授權和獲取使用者設定檔。從 2018 年 11 月開始,Microsoft 將取消對 Live SDK API 的支援,轉而支援新的 Microsoft Graph API。Keycloak 身分提供者已更新為使用新的端點,因此如果正在使用此整合,請確保您升級到 Keycloak 4.6.0 或更高版本。
由於應用程式 ID 格式的變更,在「Live SDK 應用程式」下註冊的舊版用戶端應用程式無法使用 Microsoft Graph 端點。如果您遇到錯誤,指出在目錄中找不到應用程式識別碼,您將必須在 Microsoft 應用程式註冊入口網站中重新註冊用戶端應用程式,以獲取新的應用程式 ID。
升級至 Wildfly 14
Keycloak 伺服器已升級為使用 Wildfly 14 作為底層容器。這不直接涉及任何特定的 Keycloak 伺服器功能,但是,請注意與遷移相關的這些變更
- 相依性更新
-
相依性已更新為 Wildfly 14 伺服器使用的版本。例如,Infinispan 現在是 9.3.1.Final。
- 組態變更
-
standalone(-ha).xml
和domain.xml
檔案中存在一些組態變更。您應遵循下載 Keycloak 伺服器章節來自動處理組態檔案的移轉。 - 跨資料中心複寫變更
-
-
您需要將 Infinispan 伺服器升級到 9.4.19 版。較舊的版本可能仍然可以使用,但由於我們不再測試,因此不保證其功能。
-
遷移至 4.4.0
升級至 Wildfly 13
Keycloak 伺服器已升級為使用 Wildfly 13 作為底層容器。這不直接涉及任何特定的 Keycloak 伺服器功能,但是,請注意與遷移相關的這些變更
- 相依性更新
-
相依性已更新為 Wildfly 13 伺服器使用的版本。例如,Infinispan 現在是 9.2.4.Final,而 Undertow 是 2.0.9.Final
- 組態變更
-
standalone(-ha).xml
和domain.xml
檔案中存在一些組態變更。您應遵循下載 Keycloak 伺服器章節來自動處理組態檔案的移轉。不過,以下是一些最重要的變更,如果您自行進行了組態變更,可能需要這些變更-
Infinispan 快取上的
eviction
元素現在已過時(未使用),並且已替換為object-memory
元素 -
Infinispan 子系統中的
cache-container
元素不再識別jndi-attribute
。
-
- 跨資料中心複寫變更
-
-
您需要將 Infinispan 伺服器升級到 9.4.19 版。較舊的版本可能仍然可以使用,但由於我們不再測試,因此不保證其功能。
-
您不再需要在 Infinispan 伺服器組態檔中設定安全性。
-
需要從 Infinispan 伺服器組態檔中複寫快取的組態中移除
transaction
元素。這是因為 Infinispan 的錯誤 https://issues.redhat.com/browse/ISPN-9323。
-
遷移至 4.0.0
用戶端範本已變更為用戶端範圍
我們新增了對用戶端範圍的支援,這在遷移期間需要一些注意。
- 用戶端範本已變更為用戶端範圍
-
用戶端範本已變更為用戶端範圍。如果您有任何用戶端範本,則它們的協定對應器和角色範圍對應將會保留。
- 名稱中的空格已取代
-
名稱中包含空格字元的用戶端範本已重新命名,方法是以底線取代空格,因為用戶端範圍的名稱中不允許使用空格。例如,用戶端範本
my template
將變更為用戶端範圍my_template
。 - 將用戶端範圍連結至用戶端
-
對於具有用戶端範本的用戶端,對應的用戶端範圍現在會作為
預設用戶端範圍
新增至用戶端。因此,協定對應器和角色範圍對應將會在用戶端上保留。 - Realm 預設用戶端範圍未與現有用戶端連結
-
在遷移期間,內建用戶端範圍清單會新增至每個 realm,以及
Realm 預設用戶端範圍
的清單。但是,現有的用戶端不會升級,並且新的用戶端範圍不會自動新增至它們。此外,所有協定對應器和角色範圍對應都將保留在現有用戶端上。在新版本中,當您建立新的用戶端時,它會自動附加 Realm 預設用戶端範圍,並且不會附加任何協定對應器。我們在遷移期間沒有變更現有的用戶端,因為無法正確偵測到自訂,例如,您將為用戶端的協定對應器進行自訂。如果您想要更新現有的用戶端(從它們移除協定對應器並將它們連結到用戶端範圍),您需要手動執行此操作。 - 需要再次確認同意
-
用戶端範圍的變更需要重構同意。同意現在指向用戶端範圍,而不是指向角色或協定對應器。由於此變更,使用者先前確認的持續同意不再有效,並且使用者需要在遷移後再次確認同意頁面。
- 移除了一些組態開關
-
「角色詳細資料」中已移除開關
需要範圍參數
。已從「協定對應器詳細資料」中移除開關需要同意
和同意文字
。這些開關已由用戶端範圍功能取代。
授權服務的變更
我們新增了對 UMA 2.0 的支援。此版本的 UMA 規範針對如何從伺服器取得權限引入了一些重要的變更。
以下是 UMA 2.0 支援所引入的主要變更。詳情請參閱授權服務指南。
- 已移除授權 API
-
在 UMA 2.0 (UMA 1.0) 之前,用戶端應用程式會使用授權 API 以 RPT 格式從伺服器取得權限。新版的 UMA 規範已移除授權 API,Keycloak 也一併移除。在 UMA 2.0 中,現在可以透過使用特定的授權類型從權杖端點取得 RPT。詳情請參閱授權服務指南。
- 已移除權限 API
-
隨著 UMA 2.0 的推出,我們決定利用權杖端點和 UMA 授權類型,以允許從 Keycloak 取得 RPT,並避免使用不同的 API。權限 API 所提供的功能保持不變,仍然可以從伺服器取得一組或多個資源和範圍的權限,或者在未提供資源或範圍的情況下取得所有權限。詳情請參閱授權服務指南。
- UMA 探索端點的變更
-
UMA 探索文件已變更,詳情請參閱授權服務指南。
- Keycloak 授權 JavaScript 配接器的變更
-
Keycloak 授權 JavaScript 配接器 (keycloak-authz.js) 已變更,以符合 UMA 2.0 所引入的變更,同時保持與以前相同的行為。主要的變更在於您如何調用
authorization
和entitlement
方法,這兩種方法現在都預期一個特定的物件類型,代表授權請求。這個新的物件類型透過支援 UMA 授權類型支援的不同參數,在如何從伺服器取得權限方面提供了更大的彈性。One of the main changes introduced by this release is that you are no longer required to exchange access tokens with RPTs in order to access resources protected by a resource server (when not using UMA). Depending on how the policy enforcer is configured on the resource server side, you can just send regular access tokens as a bearer token and permissions will still be enforced.
- Keycloak 授權用戶端 Java API 的變更
-
當升級到新版本的 Keycloak 授權用戶端 Java API 時,您會注意到某些表示類別已移至
org.keycloak:keycloak-core
中的不同套件。
移轉至 3.4.2
在 OpenID Connect 驗證回應中新增 session_state 參數
OpenID Connect 會話管理規範要求 OpenID Connect 驗證回應中必須存在參數 session_state
。
在過去的版本中,我們沒有這個參數,但現在 Keycloak 預設會新增此參數,這是該規範的要求。
但是,某些 OpenID Connect/OAuth2 配接器,尤其是較舊的 Keycloak 配接器,可能存在此新參數的問題。
例如,在成功驗證到用戶端應用程式後,該參數將始終存在於瀏覽器 URL 中。在這些情況下,停用將 session_state
參數新增至驗證回應可能會很有用。這可以在 Keycloak 管理主控台中針對特定用戶端完成,在用戶端詳細資訊中,位於與舊版配接器的相容性中所述的「OpenID Connect 相容性模式」區段。有一個專用的「從驗證回應中排除會話狀態」開關,可以開啟以防止將 session_state
參數新增至驗證回應。
參數 session_state 已在 3.4.2 中新增,但是開關「從驗證回應中排除會話狀態」是在 4.0.0.Beta1 中新增的。如果您的 Keycloak 伺服器是 3.4.2 或 3.4.3 版,而且您在使用 session_state 參數時遇到問題,則需要將伺服器升級到 4.0.0.Beta1 或更新的版本。 |
移轉至 3.2.0
新的密碼雜湊演算法
我們新增了兩種新的密碼雜湊演算法 (pbkdf2-sha256 和 pbkdf2-sha512)。新的領域將使用 pbkdf2-sha256 雜湊演算法,並使用 27500 次雜湊疊代。由於 pbkdf2-sha256 比 pbkdf2 稍快,因此疊代次數從 20000 次增加到 27500 次。
如果密碼原則包含雜湊演算法 (未指定) 和疊代次數 (20000) 的預設值,則會升級現有領域。如果您已變更雜湊疊代次數,則需要手動變更為 pbkdf2-sha256,如果您想使用更安全的雜湊演算法。
ID 權杖需要 scope=openid
OpenID Connect 規範要求在初始授權請求中使用帶有值 openid
的參數 scope
。因此,在 Keycloak 2.1.0 中,我們變更了我們的配接器,以在重新導向至 Keycloak 的 URI 中使用 scope=openid
。現在我們也變更了伺服器部分,只有在真正使用 scope=openid
的情況下,才會將 ID 權杖傳送至應用程式。如果未使用,則會略過 ID 權杖,只會將存取權杖和重新整理權杖傳送至應用程式。這也允許您故意省略 ID 權杖的產生,例如為了空間或效能目的。
直接授權 (OAuth2 資源擁有者密碼憑證授權) 和服務帳戶登入 (OAuth2 用戶端憑證授權) 現在預設也不會使用 ID 權杖。您需要明確新增 scope=openid
參數才能包含 ID 權杖。
驗證會話和動作權杖
我們正在開發對多個資料中心的支援。作為初始步驟,我們引入了驗證會話和動作權杖。驗證會話取代了先前版本中使用的用戶端會話。目前動作權杖特別用於驗證器或 requiredActionProvider 需要向使用者傳送電子郵件並要求使用者按一下電子郵件中的連結的案例。
以下是與此相關的具體變更,可能會影響您的移轉。
與此相關的第一個變更是,在 standalone.xml
或 standalone-ha.xml
中引入新的 Infinispan 快取 authenticationSessions
和 actionTokens
。如果您使用我們的移轉 CLI,則無需太擔心,因為您的 standalone(-ha).xml
檔案將會自動移轉。
第二個變更是變更驗證 SPI 方法中某些簽名。如果您使用自訂 Authenticator
或 RequiredActionProvider
,這可能會影響您。類別 AuthenticationFlowContext
和 RequiredActionContext
現在允許擷取驗證會話,而不是用戶端會話。
我們也新增了對黏性會話的一些初始支援。您可能想要變更您的負載平衡器/Proxy 伺服器,並在您不希望受到它的影響並希望獲得更好的效能時設定它。路由已新增至新的 AUTH_SESSION_ID
Cookie。更多資訊請參閱叢集文件。
另一個變更是,token.getClientSession()
已移除。如果您使用例如用戶端起始的身分識別 Broker 連結功能,這可能會影響您。
ScriptBasedAuthenticator
將繫結名稱從 clientSession
變更為 authenticationSession
,因此如果您正在使用此驗證器,則需要更新您的指令碼。
最後,我們在管理主控台中新增了一些新的逾時。例如,這允許您為管理員和使用者本身觸發的電子郵件動作指定不同的逾時。
移轉至 2.5.1
舊版離線權杖的移轉
如果您從 2.2.0 或更舊的版本移轉,並且您使用了離線權杖,則您的離線權杖在權杖標頭中沒有 KID。我們在 2.3.0 中將 KID 新增至權杖標頭,同時新增了擁有多個領域金鑰的功能,因此 Keycloak 能夠根據權杖 KID 找到正確的金鑰。
對於沒有 KID 的離線權杖,Keycloak 2.5.1 將始終使用作用中的領域金鑰來尋找權杖驗證的正確金鑰。換句話說,舊版離線權杖的移轉將會正常運作。因此,例如,您的使用者在 1.9.8 中請求了離線權杖,然後您從 1.9.8 移轉到 2.5.1,然後您的使用者仍然能夠在 2.5.1 版本中重新整理其舊的離線權杖。
但是存在限制。一旦您變更領域作用中的金鑰,使用者將無法再重新整理舊的離線權杖。因此,在所有具有離線權杖的使用者重新整理其權杖之前,您不應該變更作用中的領域金鑰。顯然,新重新整理的權杖在標頭中將具有 KID,因此在所有使用者交換其舊的離線權杖後,您可以自由變更作用中的領域金鑰。
移轉至 2.4.0
伺服器 SPI 分割為伺服器 SPI 和伺服器 SPI Private
keycloak-server-spi 模組已分割為 keycloak-server-spi 和 keycloak-server-spi-private。keycloak-server-spi 中的 API 在次要版本之間不會變更,而我們保留權利,並且很可能會在次要版本之間變更 keycloak-server-spi-private 中的 API。
移轉至 2.3.0
不建議使用 realm-public-key
配接器屬性
在 2.3.0 版本中,我們新增了對公開金鑰輪換的支援。當管理員在 Keycloak 管理主控台中輪換領域金鑰時,用戶端配接器將能夠識別它,並自動從 Keycloak 下載新的公開金鑰。但是,只有當您的配接器中沒有帶有硬式編碼公開金鑰的 realm-public-key
選項時,才會進行新的金鑰的自動下載。因此,我們不再建議在配接器設定中使用 realm-public-key
選項。
請注意,此選項仍然支援,但只有在您真的想在您的介面卡設定中硬式編碼公開金鑰,且永遠不從 Keycloak 下載公開金鑰時,才可能有用。理論上,其中一個原因可能是為了避免介面卡和 Keycloak 之間有不信任網路時發生的中間人攻擊。然而,在這種情況下,更好的選擇是使用 HTTPS,這將保護介面卡和 Keycloak 之間的所有請求。
移轉至 2.2.0
databaseSchema
屬性已棄用
JPA 和 Mongo 的 databaseSchema
屬性現在已棄用,並由 initializeEmpty
和 migrationStrategy
取代。initializeEmpty
可以設定為 true
或 false
,並控制是否應初始化空的資料庫。migrationStrategy
可以設定為 update
、validate
和 manual
。manual
僅支援關聯式資料庫,並會寫入一個 SQL 檔案,其中包含對資料庫結構描述的必要變更。請注意,對於 Oracle 資料庫,建立的 SQL 檔案包含 Oracle SQL 用戶端理解的 SET DEFINE OFF
命令。如果指令碼由任何其他用戶端使用,請將這些行替換為您選擇的工具的等效命令,該命令會停用變數擴展,或者如果此功能不適用,則完全刪除它。
用戶端有效重新導向 URI 的變更
以下情況會受到影響
-
當在用戶端中儲存具有查詢元件的有效重新導向 URI(例如
https://127.0.0.1/auth?foo=bar
)時,授權請求中的redirect_uri
必須與此 URI(或此用戶端中的其他已註冊 URI)完全符合。 -
當在用戶端中儲存沒有查詢元件的有效重新導向 URI 時,
redirect_uri
也必須完全符合。 -
當此 URI 中存在查詢元件時,已註冊的有效重新導向 URI 中的萬用字元不再支援,因此
redirect_uri
也需要與此儲存的 URI 完全符合。 -
不再允許已註冊的有效重新導向 URI 中的片段(如
https://127.0.0.1/auth#fragment
)。
移轉至 1.9.0
已移動佈景主題和提供者目錄
我們已將佈景主題和提供者目錄從 standalone/configuration/themes
和 standalone/configuration/providers
移動到分別是 themes
和 providers
。如果您已新增自訂佈景主題和提供者,則需要將它們移動到新的位置。您也需要更新 keycloak-server.json
,因為它已因此而變更。
只有在 Keycloak 開啟時,介面卡子系統才會帶入相依性
先前,如果您已將我們的 SAML 或 OIDC Keycloak 子系統介面卡安裝到 WildFly 或 JBoss EAP 中,我們會自動將 Keycloak 用戶端 jar 包含到每個應用程式中,無論您是否使用 Keycloak。現在,只有在您為該介面卡開啟 Keycloak 驗證時(透過子系統或 web.xml 中的 auth-method),才會將這些程式庫新增至您的部署。
已重新命名驗證回應中的工作階段狀態參數
在 OpenID Connect 驗證回應中,我們過去會將工作階段狀態傳回為 session-state
,這不符合規格,並且已重新命名為 session_state
。
已棄用的 OpenID Connect 端點
在 1.2 中,我們已棄用許多與 OpenID Connect 規格不一致的端點,這些端點現在已移除。這也適用於驗證權杖端點,該端點已由 1.8 中的新內省端點取代。
模組和原始碼重新組織
我們的大部分模組和原始碼都已整合到兩個 Maven 模組中:keycloak-server-spi 和 keycloak-services。SPI 介面位於 server-spi 中,實作位於 keycloak-services 中。所有 JPA 相依模組都已整合到 keycloak-model-jpa 下。mongo 和 Infinispan 也是如此,分別位於模組 keycloak-model-mongo 和 keycloak-model-infinispan 下。
移轉至 1.8.0
OAuth2 權杖內省
為了新增更多符合 OAuth2 規格的內容,我們新增了用於權杖內省的新端點。可以在 /realms/{realm-name}/protocols/openid-connect/token/introspect
存取新的端點,並且它完全基於 RFC-7662
。
/realms/{realm-name}/protocols/openid-connect/validate
端點現在已棄用,我們強烈建議您盡快移至新的內省端點。此變更的原因是 RFC-7662 提供更標準且安全的內省端點。
現在可以從 OpenID Connect 提供者的設定 /realms/{realm-name}/.well-known/openid-configuration
取得新的權杖內省 URL。您會在回應中找到一個具有名稱 token_introspection_endpoint
的宣告。只有 機密用戶端
才允許叫用新的端點,這些用戶端通常會作為資源伺服器,並尋找權杖中繼資料以執行本機授權檢查。
移轉至 1.7.0.CR1
用戶端的直接存取授權預設為停用
為了新增更多符合 OpenID Connect 規格的內容,我們在管理控制台的「用戶端設定」頁面中新增了旗標,您可以在其中啟用/停用各種 OpenID Connect/OAuth2 流程(標準流程、隱含流程、直接存取授權、服務帳戶)。作為此流程的一部分,我們預設為新用戶端停用 直接存取授權
(對應於 OAuth2 資源擁有者密碼認證授權
)。
從先前版本移轉的用戶端只有在具有 僅直接授權
旗標時,才會啟用 直接存取授權
。僅直接授權
旗標已移除,因為如果您啟用「直接存取授權」並停用「標準+隱含流程」,您將獲得相同的效果。
我們也為每個領域新增了內建用戶端 admin-cli
。此用戶端已啟用 直接存取授權
。因此,如果您使用管理 REST API 或 Keycloak 管理用戶端,您應該更新您的設定以使用 admin-cli
,而不是 security-admin-console
,因為後者預設不再啟用直接存取授權。
「首次登入時更新設定檔」選項已從身分提供者移至「檢閱設定檔」驗證器
在此版本中,我們新增了 First Broker Login
功能,讓您可以指定當新使用者透過身分提供者(或社群提供者)登入,但沒有 Keycloak 使用者連結到該社群帳戶時,應執行的具體操作。作為這項工作的一部分,我們在身分提供者中新增了 First Login Flow
選項,您可以在其中指定流程,然後在管理控制台的「驗證 (Authentication)」標籤下設定此流程。
我們也從身分提供者設定中移除了 Update Profile On First Login
選項,並將其移至 Review Profile
驗證器的設定中。因此,一旦您指定身分提供者應使用的流程(預設為 First Broker Login
流程),請前往「驗證 (Authentication)」標籤,選擇該流程,然後在 Review Profile
驗證器下設定該選項。
web.xml 中的 'form-error-page' 元素不再支援
web.xml 中的 form-error-page 將不再適用於用戶端配接器驗證錯誤。您必須為各種 HTTP 錯誤代碼定義 error-page。如果您想攔截並處理配接器錯誤情況,請參閱文件以瞭解更多詳細資訊。
IdentityProviderMapper 變更
介面本身和方法簽名沒有變更。但是,行為上存在一些變更。我們在此版本中新增了 First Broker Login
流程,並且現在會在 First Broker Login
流程完成後呼叫 IdentityProviderMapper.importNewUser
方法。因此,如果您想要在「檢閱設定檔 (Review Profile)」頁面中使用任何屬性,您需要使用 preprocessFederatedIdentity
方法,而不是 importNewUser
。您可以透過呼叫 BrokeredIdentityContext.setUserAttribute
來設定任何屬性,這將在「檢閱設定檔 (Review profile)」頁面上可用。
移轉至 1.6.0.Final
重新整理權杖不再可重複使用的選項
舊版本的 Keycloak 允許多次重複使用重新整理權杖。Keycloak 仍然允許這樣做,但也有一個 Revoke refresh token
選項來禁止它。該選項位於管理控制台的權杖設定中。當重新整理權杖用於獲取新的存取權杖時,也會包含一個新的重新整理權杖。啟用該選項後,下次重新整理存取權杖時應使用此新的重新整理權杖。將無法多次重複使用舊的重新整理權杖。
移轉至 1.5.0.Final
領域和使用者快取提供者
Infinispan 現在是預設且唯一的領域和使用者快取提供者。在非叢集模式下,使用本機 Infinispan 快取。我們也移除了自訂的記憶體內快取和無快取提供者。如果您在 keycloak-server.json 中將 realmCache 或 userCache 設定為 mem 或 none,請將其移除。由於 Infinispan 是唯一的提供者,因此不再需要 realmCache 和 userCache 物件,可以將其移除。
使用工作階段提供者
Infinispan 現在是預設且唯一的使用者工作階段提供者。在非叢集模式下,使用本機 Infinispan 快取。我們也移除了 JPA 和 Mongo 使用者工作階段提供者。如果您在 keycloak-server.json 中將 userSession 設定為 mem、jpa 或 mongo,請將其移除。由於 Infinispan 是唯一的提供者,因此不再需要 userSession 物件,可以將其移除。
對於任何想要提高使用者工作階段持久性的人來說,可以透過將使用者工作階段快取設定為多個擁有者或使用複寫快取來實現。也可以設定 Infinispan 來持久化快取,儘管這會對效能產生影響。
移轉至 1.3.0.Final
UserFederationProvider 已變更
UserFederationProvider 介面有一些微小的變更。您可能需要在升級到較新版本並升級一些已變更簽名的方法時同步您的實作。變更很小,但需要改進同盟的效能。
WildFly 9.0.0.Final
繼上次版本中所做的發佈變更之後,Keycloak 的獨立下載現在基於 WildFly 9.0.0.Final。這也會影響只能部署到 WildFly 9.0.0.Final 或 JBoss EAP 6.4.0.GA 的覆蓋。伺服器不再支援 WildFly 8.2.0.Final。
WildFly、JBoss EAP 和 JBoss AS7 配接器
現在有 3 個針對 WildFly、JBoss EAP 和 JBoss AS7 的單獨配接器下載
-
eap6
-
wf9
-
wf8
-
as7
請確保您取得正確的配接器。
您也需要更新 standalone.xml,因為擴充模組和子系統定義已變更。請參閱 保護應用程式指南以瞭解詳細資訊。
從 1.2.0.Beta1 移轉至 1.2.0.RC1
從 1.1.0.Final 移轉至 1.2.0.Beta1
存取權杖和識別碼權杖中的 iss
存取權杖和識別碼權杖中 iss
宣告的值已從 realm name
變更為 realm url
。這是 OpenID Connect 規範的要求。如果您正在使用我們的配接器,則不需要進行任何變更,除非您一直在使用僅限持有者且未指定 auth-server-url
,則現在必須新增它。如果您正在使用其他程式庫(或 RSATokenVerifier),則在驗證 iss
時需要進行相應的變更。
OpenID Connect 端點
為了符合 OpenID Connect 規範,驗證和權杖端點已變更為具有單個驗證端點和單個權杖端點。根據規範,使用 response_type
和 grant_type
參數來選擇所需的流程。舊的端點 (/realms/{realm-name}/protocols/openid-connect/login
、/realms/{realm-name}/protocols/openid-connect/grants/access
、/realms/{realm-name}/protocols/openid-connect/refresh
、/realms/{realm-name}/protocols/openid-connect/access/codes
) 現在已棄用,並將在未來版本中移除。
主題變更
主題的版面配置已變更。過去使用的目錄階層是 type/name
,現在已變更為 name/type
。例如,一個名為 sunrise
的登入主題過去會部署到 standalone/configuration/themes/login/sunrise
,現在已移至 standalone/configuration/themes/sunrise/login
。進行此變更的目的是為了讓同一主題的不同類型更容易分組到一個資料夾中。
如果您過去將主題部署為 JAR,則必須建立一個需要 Java 程式碼的自訂主題載入器。這已簡化為僅需要一個純文字檔案 (META-INF/keycloak-themes.json
) 來描述 JAR 中包含的主題。
宣告變更
先前,管理控制台中存在一個專用的「宣告 (Claims)」標籤,用於應用程式和 OAuth 用戶端。它用於設定哪些屬性應進入特定應用程式/用戶端的存取權杖。此標籤已移除,並替換為更靈活的通訊協定對應器。
您無需擔心從先前版本遷移資料庫。我們為 RDBMS 和 Mongo 都編寫了遷移腳本,這應確保為特定應用程式/用戶端設定的宣告將轉換為相應的通訊協定對應器(不過,在遷移到較新版本之前,備份 DB 更安全)。從先前版本匯出的 JSON 表示形式也是如此。
社群遷移到身分代理
我們重構了社群提供者 SPI,並將其替換為更靈活的身分代理 SPI。管理控制台中的「社群 (Social)」標籤已重新命名為「身分提供者 (Identity Provider)」標籤。
同樣,您無需擔心從先前版本遷移資料庫,與宣告/通訊協定對應器類似。社群提供者的設定和使用者的「社群連結」都將轉換為相應的身分提供者。
您唯一需要執行的操作是變更特定第三方社群提供者管理控制台中允許的 Redirect URI
。您可以先前往 Keycloak 管理控制台,並從您設定身分提供者的頁面複製 Redirect URI。然後,您可以將其簡單地貼到第三方提供者的管理控制台中作為允許的 Redirect URI(例如,Facebook 管理控制台)。
從 1.1.0.Beta1 移轉至 1.1.0.Beta2
-
配接器現在是單獨下載的。它們不包含在設備和 war 發佈中。我們現在有太多了,而且發佈變得臃腫。
-
org.keycloak.adapters.tomcat7.KeycloakAuthenticatorValve
+org.keycloak.adapters.tomcat.KeycloakAuthenticatorValve
-
JavaScript 轉接器現在具有 idToken 和 idTokenParsed 屬性。如果您使用 idToken 來檢索名字、電子郵件等資訊,您需要將其更改為 idTokenParsed。
-
as7-eap-subsystem 和 keycloak-wildfly-subsystem 已合併為一個 keycloak-subsystem。如果您有現有的 standalone.xml 或 domain.xml,您需要在檔案頂部附近編輯,並將擴充模組名稱更改為 org.keycloak.keycloak-subsystem。僅針對 AS7,擴充模組名稱為 org.keycloak.keycloak-as7-subsystem。
-
伺服器安裝不再支援在 AS7 上執行。您仍然可以將 AS7 用作應用程式用戶端。
從 1.0.x.Final 遷移到 1.1.0.Beta1
-
RealmModel JPA 和 Mongo 儲存架構已變更
-
UserSessionModel JPA 和 Mongo 儲存架構已變更,因為這些介面已重構
-
升級您的轉接器,舊的轉接器與 Keycloak 1.1 不相容。我們錯誤地解讀了 JSON Web Token 和 OIDC ID Token 規範。 'aud' 宣告必須是 client id,我們將 realm 名稱儲存在那裡並進行驗證。
從 1.0 RC-1 遷移到 RC-2
-
許多資訊級別的日誌已變更為除錯級別。此外,realm 預設不再具有 jboss-logging 稽核偵聽器。如果您想要在使用者登入、登出、變更密碼等時記錄輸出,請透過管理控制台啟用 jboss-logging 稽核偵聽器。
從 1.0 Beta 4 遷移到 RC-1
-
登出 REST API 已重構。登出 URI 的 GET 請求不再接受 session_state 參數。您必須登入才能登出會話。您也可以 POST 到登出 REST URI。此操作需要有效的重新整理令牌才能執行登出。簽名與重新整理令牌相同,但少了 grant type 表單參數。詳細資訊請參閱文件。
從 1.0 Beta 1 遷移到 Beta 4
-
LDAP/AD 設定已變更。它不再位於「設定」頁面下。現在位於「使用者」→「聯盟」下。「新增提供者」將顯示「ldap」選項。
-
驗證 SPI 已移除並重寫。新的 SPI 是 UserFederationProvider,它更加靈活。
-
ssl-not-required
+ssl-required
+all
+external
+none
-
資料庫架構再次變更。
-
建立的應用程式現在預設具有完整範圍。這表示如果您不想要,則不必設定應用程式的範圍。
-
用於匯入 realm 資料的 JSON 檔案格式已變更。現在,角色對應位於特定使用者的 JSON 記錄下。
從 1.0 Alpha 4 遷移到 Beta 1
-
資料庫架構已變更。我們已將資料庫匯出新增至 Beta 1,但無法從舊版本匯入資料庫。未來版本將支援此功能。
-
對於除 bearer-only 應用程式之外的所有用戶端,您必須指定至少一個重新導向 URI。除非您為該應用程式指定有效的重新導向 URI,否則 Keycloak 將不允許您登入。
-
Direct Grant API +
ON
-
standalone/configuration/keycloak-server.json
-
JavaScript 轉接器
-
會話逾時
從 1.0 Alpha 2 遷移到 Alpha 3
-
SkeletonKeyToken、SkeletonKeyScope、SkeletonKeyPrincipal 和 SkeletonKeySession 已分別重新命名為:AccessToken、AccessScope、KeycloakPrincipal 和 KeycloakAuthenticatedSession。
-
ServletOAuthClient.getBearerToken() 方法簽名已變更。現在它會傳回 AccessTokenResponse,以便您也可以取得重新整理令牌。
-
轉接器現在會檢查每次請求的存取令牌過期時間。如果令牌已過期,它們會嘗試使用已儲存的重新整理令牌在驗證伺服器上叫用重新整理。
-
AccessToken 中的 Subject 已變更為使用者 ID。
從 1.0 Alpha 1 遷移到 Alpha 2
-
資料庫架構已變更。截至 Alpha 2,我們還沒有任何資料遷移公用程式。
-
JBoss 和 WildFly 轉接器現在透過 WildFly 子系統安裝。請檢閱轉接器安裝文件。現在需要編輯 standalone.xml。
-
引入了一種新的憑證類型「secret」。與其他憑證類型不同,它以純文字形式儲存在資料庫中,並且可以在管理控制台中檢視。
-
不再需要應用程式和 OAuth 用戶端憑證。這些用戶端類型現在硬式編碼為使用「secret」憑證類型。
-
由於應用程式和 OAuth 用戶端的「secret」憑證變更,您必須更新 keycloak.json 設定檔,並在管理控制台中的「應用程式」或「OAuth 用戶端」憑證索引標籤中重新產生一個密碼。
升級 Keycloak 伺服器
您在升級轉接器之前升級伺服器。
準備升級
在升級伺服器之前,請執行下列步驟。
-
關閉 Keycloak。
-
備份舊的安裝,例如組態、主題等等。
-
如果已啟用 XA 交易,請處理任何開啟的交易,並刪除
data/transaction-logs/
交易目錄。 -
使用關聯式資料庫文件中的指示備份資料庫。
升級伺服器後,資料庫將不再與舊伺服器相容。如果您需要還原升級,請先還原舊的安裝,然後從備份副本還原資料庫。
如果您的現有設定中停用了功能 |
有關暴力破解偵測的登入失敗資訊和目前進行中的驗證流程僅儲存在 Keycloak 關閉時清除的內部快取中。目前正在驗證、變更密碼或重設密碼的使用者,需要在 Keycloak 啟動並再次執行後重新啟動驗證流程。 |
下載 Keycloak 伺服器
在您準備好升級後,您可以下載伺服器。
-
從 Keycloak 網站下載並解壓縮 keycloak-26.0.5.zip。
解壓縮此檔案後,您應該會有一個名為
keycloak-26.0.5
的目錄。 -
將此目錄移動到所需的位置。
-
將上一個安裝的
conf/
、providers/
和themes/
複製到新的安裝中。
遷移資料庫
Keycloak 可以自動遷移資料庫架構,您也可以選擇手動執行。預設情況下,當您第一次啟動新安裝時,資料庫會自動遷移。
自動關聯式資料庫遷移
若要執行自動遷移,請啟動連接到所需資料庫的伺服器。如果新伺服器版本的資料庫架構已變更,除非資料庫記錄太多,否則遷移會自動開始。
例如,在具有數百萬條記錄的表格上建立索引可能很耗時,並導致嚴重的服務中斷。因此,自動遷移存在 300000
條記錄的閾值。如果記錄數超過此閾值,則不會建立索引。相反地,您會在伺服器記錄中找到警告,其中包含您可以手動套用的 SQL 命令。
若要變更閾值,請設定預設 connections-liquibase
提供者的 index-creation-threshold
屬性值
kc.[sh|bat] start --spi-connections-liquibase-default-index-creation-threshold=300000
手動關聯式資料庫遷移
若要啟用手動升級資料庫架構,請將預設 connections-jpa
提供者的 migration-strategy
屬性值設定為「manual」
kc.[sh|bat] start --spi-connections-jpa-quarkus-migration-strategy=manual
當您使用此設定啟動伺服器時,伺服器會檢查是否需要遷移資料庫。所需的變更會寫入 bin/keycloak-database-update.sql
SQL 檔案,您可以檢閱並手動對資料庫執行這些變更。
若要變更匯出 SQL 檔案的路徑和名稱,請設定預設 connections-jpa
提供者的 migration-export
屬性
kc.[sh|bat] start --spi-connections-jpa-quarkus-migration-export=<path>/<file.sql>
有關如何將此檔案套用至資料庫的詳細資訊,請參閱關聯式資料庫的文件。變更寫入檔案後,伺服器會結束。
遷移主題
如果您建立了自訂佈景主題,則必須將這些佈景主題移轉到新的伺服器。此外,對內建佈景主題的任何變更可能也需要反映在您的自訂佈景主題中,具體取決於您自訂的方面。
-
將您的自訂佈景主題從舊伺服器的
themes
目錄複製到新伺服器的themes
目錄。 -
請使用以下章節來移轉範本、訊息和樣式。
-
如果您自訂了移轉變更中列出的任何更新範本,請比較基礎佈景主題中的範本,以檢查您是否需要套用任何變更。
-
如果您自訂了訊息,您可能需要變更金鑰或值,或新增其他訊息。
-
如果您自訂了任何樣式,並且您正在擴展 Keycloak 佈景主題,請檢閱樣式的變更。如果您正在擴展基礎佈景主題,則可以跳過此步驟。
-
移轉範本
如果您自訂了任何範本,請檢閱新版本以決定是否更新您的自訂範本。如果您進行了細微的變更,您可以將更新的範本與您的自訂範本進行比較。但是,如果您進行了許多變更,請考慮將新範本與您的自訂範本進行比較。此比較將顯示您需要進行哪些變更。
您可以使用差異工具來比較範本。以下螢幕截圖比較了「登入」佈景主題中的 info.ftl
範本和一個範例自訂佈景主題
此比較顯示第一個變更 (Hello world!!
) 是一個自訂,而第二個變更 (if pageRedirectUri
) 是對基礎佈景主題的變更。透過將第二個變更複製到您的自訂範本,您已成功更新了您的自訂範本。
在另一種方法中,以下螢幕截圖比較了舊安裝中的 info.ftl
範本與新安裝中更新的 info.ftl
範本
此比較顯示了基礎範本中已變更的內容。然後,您可以手動將相同的變更套用到您的修改範本。由於此方法更複雜,因此僅在第一種方法不可行時才使用此方法。
升級 Keycloak 配接器
在您升級 Keycloak 伺服器後,您可以升級配接器。較早版本的配接器可能適用於較新版本的 Keycloak 伺服器,但較早版本的 Keycloak 伺服器可能不適用於較新版本的配接器。
與較舊配接器的相容性
較新版本的 Keycloak 伺服器可能會與較舊版本的配接器搭配使用。但是,Keycloak 伺服器的一些修正可能會破壞與較舊版本配接器的相容性。例如,OpenID Connect 規格的新實作可能與較舊的用戶端配接器版本不符。
對於這種情況,您可以使用相容性模式。對於 OpenID Connect 用戶端,管理主控台在具有用戶端詳細資訊的頁面上包含 OpenID Connect 相容性模式。透過此選項,您可以停用 Keycloak 伺服器的一些新功能,以保留與較舊用戶端配接器的相容性。如需更多詳細資訊,請參閱各個開關的工具提示。
升級 Keycloak 用戶端程式庫
用戶端程式庫是那些成品
-
Java 管理用戶端 - Maven 成品
org.keycloak:keycloak-admin-client
-
Java 授權用戶端 - Maven 成品
org.keycloak:keycloak-authz-client
-
Java 原則執行器 - Maven 成品
org.keycloak:keycloak-policy-enforcer
用戶端程式庫支援最後支援的 Keycloak 伺服器版本。
用戶端程式庫也可能適用於較舊版本的 Keycloak 伺服器,但不保證且未獲得官方支援。
可能需要查閱 Java 管理用戶端等用戶端程式庫的 javadoc,以查看哪些端點和參數受到哪個 Keycloak 伺服器版本的支援。