Keycloak 26.0.5

使用 Microsoft Active Directory 时,LDAP 用户默认情况下被创建为已启用

如果您使用的是 Microsoft AD 并通过管理界面创建用户,则用户将默认情况下被创建为已启用。

在以前的版本中,只有在为用户设置(非临时)密码后才能更新用户状态。这种行为与其他内置用户存储不一致,也不一致于 LDAP 提供程序支持的其他 LDAP 供应商。

Keycloak 26.0.0

支持的组织

从 Keycloak 26 开始,完全支持组织功能。

客户端库更新

客户端库的专用发布周期

从本版本开始,一些 Keycloak 客户端库将拥有独立于 Keycloak 服务器发布周期的发布周期。26.0.0 版本可能是最后一次客户端库与 Keycloak 服务器一起发布的版本。但从现在开始,客户端库可能在与 Keycloak 服务器不同的时间发布。

客户端库是这些工件

  • Java 管理客户端 - Maven 工件 org.keycloak:keycloak-admin-client

  • Java 授权客户端 - Maven 工件 org.keycloak:keycloak-authz-client

  • Java 策略执行程序 - Maven 工件 org.keycloak:keycloak-policy-enforcer

将来可能还会包含更多库。

客户端库支持 Java 8,因此可以在部署在较旧应用程序服务器上的客户端应用程序中使用它们。

客户端库与服务器的兼容性

从本版本开始,我们使用相同服务器版本和几个之前的重大服务器版本测试和支持客户端库。

有关客户端库与服务器版本支持的版本的详细信息,请参阅 升级指南

用户会话默认情况下被持久化

Keycloak 25 引入了 persistent-user-sessions 功能。启用此功能后,所有用户会话都将持久化到数据库中,而不是以前仅将离线会话持久化到数据库中的行为。在 Keycloak 26 中,此功能默认情况下处于启用状态。这意味着所有用户会话默认情况下都将持久化到数据库中。

可以通过禁用该功能将此行为还原到以前的状态。有关更多详细信息,请按照 配置分布式缓存 指南中 易失性用户会话 部分进行操作。

有关如何升级的信息,请参阅 升级指南

新的默认登录主题

现在有一个新版本 (v2) 的 keycloak 登录主题,它提供了改进的外观和感觉,包括支持根据用户偏好自动切换到深色主题。

先前版本 (v1) 现在已弃用,将在将来某个版本中删除。

对于所有新的 realm,keycloak.v2 将是默认登录主题。此外,任何从未明确设置登录主题的现有 realm 将切换到 keycloak.v2

高可用性多站点部署

Keycloak 26 对推荐的 HA 多站点体系结构进行了重大改进,最值得注意的是

  • Keycloak 部署现在能够同时处理两个站点中的用户请求。

  • 现在需要对站点之间连接性的主动监控,以便在发生故障时更新站点之间的复制。

  • 负载均衡器蓝图已更新为使用 AWS Global Accelerator,因为这避免了由客户端的 DNS 缓存导致的长时间故障转移。

  • 持久性用户会话现在是体系结构的要求。因此,用户会话将在 Keycloak 或 Infinispan 升级期间保留。

有关如何迁移的信息,请参阅 升级指南

管理员引导和恢复

在过去,当所有管理员用户都被锁定后重新访问 Keycloak 实例是一个具有挑战性和复杂的过程。Keycloak 认识到这些挑战并旨在显著提升用户体验,现在提供了几种简单的方法来引导临时管理员帐户并恢复丢失的管理员访问权限。

现在可以使用特定选项运行 startstart-dev 命令来创建临时管理员帐户。此外,还引入了新的专用命令,允许用户轻松地重新获得管理员访问权限。

有关此主题的详细说明和更多信息,请参阅 管理员引导和恢复 指南。

OpenTelemetry 追踪预览

对 OpenTelemetry 追踪的底层 Quarkus 支持已暴露给 Keycloak,并允许获取应用程序跟踪以实现更好的可观察性。它有助于查找性能瓶颈,确定应用程序故障的原因,跟踪分布式系统中的请求等等。该支持处于预览模式,我们很乐意获得任何反馈。

有关更多信息,请参阅 启用追踪 指南。

用于可验证凭据签发的 OpenID

可验证凭据签发 OpenID (OID4VCI) 仍然是 Keycloak 中的一个实验性功能,但在这个版本中得到了极大的改进。您将在 Keycloak OAuth SIG 中找到大量的开发和讨论。欢迎 Keycloak 社区的任何成员加入。

非常感谢 OAuth SIG 组的所有成员参与此功能的开发和讨论。特别感谢 Francis PouatchaPascal KnüppelTakashi NorimatsuIngrid KamgaStefan WiedemannThomas Darimont

DPoP 改进

DPoP(OAuth 2.0 证明拥有权)预览功能已得到改进。DPoP 现在支持所有授权类型。在之前的版本中,此功能仅支持 authorization_code 授权类型。UserInfo 端点也支持 DPoP 令牌类型。

非常感谢 Pascal Knüppel 的贡献。

删除 GELF 日志处理程序

GELF 支持已经过时了一段时间,在这个版本中它终于从 Keycloak 中删除了。其他日志处理程序可用,并完全支持用作 GELF 的替代,例如 Syslog。有关详细信息,请参阅 日志记录指南

管理员 REST API 的轻量级访问令牌

现在可以在管理员 REST API 上使用轻量级访问令牌。security-admin-consoleadmin-cli 客户端现在默认使用轻量级访问令牌,因此这两个客户端现在启用了“始终使用轻量级访问令牌”和“允许完整范围”。但是,管理员控制台的行为应该保持不变。如果您对这两个客户端进行了更改,并且您将它们用于其他目的,请谨慎操作。

Keycloak JavaScript 适配器现在是独立的

Keycloak JavaScript 适配器现在是一个独立的库,因此不再从 Keycloak 服务器静态提供。目标是将库与 Keycloak 服务器分离,以便可以独立地重构库,简化代码并在将来更易于维护。此外,该库现在没有第三方依赖关系,这使其更轻量级,更易于在不同的环境中使用。

有关更改的完整细分,请参阅 升级指南

主机名 v1 功能已删除

已删除过时的主机名 v1 功能。此功能在 Keycloak 25 中被弃用,并被主机名 v2 取代。如果您仍在使用此功能,则必须迁移到主机名 v2。有关更多详细信息,请参阅 配置主机名 (v2)初始迁移指南

从根目录到相对路径的自动重定向

当指定 http-relative-path 属性时,用户会自动重定向到 Keycloak 托管的路径。这意味着当将相对路径设置为 /auth 时,用户访问 localhost:8080/,页面会重定向到 localhost:8080/auth

当指定 http-management-relative-pathhttp-relative-path 属性时,管理界面也是如此。

它改善了用户体验,因为用户不再需要显式地将相对路径设置为 URL。

在重启之间持久化撤销的访问令牌

在此版本中,当使用嵌入式缓存时,撤销的访问令牌默认写入数据库并在集群重新启动时重新加载。

有关如何迁移的信息,请参阅 升级指南

客户端策略中的客户端属性条件

基于客户端属性的条件已添加到客户端策略中。您可以使用条件来指定具有指定值的指定客户端属性的客户端。如客户端策略文档中所述,在评估此条件时可以使用 AND 或 OR 条件。

非常感谢 Yoshiyuki Tabata 的贡献。

为日志处理程序指定不同的日志级别

可以为所有可用的日志处理程序指定日志级别,例如 consolefilesyslog。更细粒度的方案提供了控制整个应用程序日志记录的能力,并可以根据您的需求进行调整。

有关更多信息,请参阅 日志记录指南

代理选项已删除

已删除过时的 proxy 选项。此选项在 Keycloak 24 中被弃用,并被 proxy-headers 选项结合主机名选项(如果需要)取代。有关更多详细信息,请参阅 使用反向代理初始迁移指南

添加了选项 proxy-trusted-addresses

proxy-headers 选项设置为指定信任的代理地址的白名单时,可以使用 proxy-trusted-addresses。如果给定请求的代理地址不可信,则不会使用相应的代理标头值。

添加了选项 proxy-protocol-enabled

proxy-protocol-enabled 选项控制服务器是否应该在从代理后面提供请求时使用 HA PROXY 协议。当设置为 true 时,返回的远程地址将是来自实际连接客户端的地址。

添加了重新加载信任和密钥材料的选项

可以设置 https-certificates-reload-period 选项来定义 https-* 选项引用的密钥库、信任库和证书文件的重新加载周期。使用 -1 禁用重新加载。默认为 1h(一小时)。

添加了配置缓存最大计数的选项

可以设置 --cache-embedded-${CACHE_NAME}-max-count= 来定义指定缓存中缓存条目数量的上限。

https-trust-store-* 选项已取消弃用

根据社区反馈,我们决定取消弃用 https-trust-store-* 选项以允许在受信任的证书中获得更好的粒度。

java-keystore 密钥提供程序支持更多算法和保管库机密

java-keystore 密钥提供程序允许从外部 java 密钥库文件加载领域密钥,它已被修改以管理所有 Keycloak 算法。此外,密钥库和密钥机密(用于从存储库中检索实际密钥)可以使用 保管库 进行配置。因此,Keycloak 领域可以将任何密钥外部化为加密文件,而不会在数据库中存储敏感数据。

有关此主题的更多信息,请参阅 配置领域密钥

添加对 ECDH-ES 加密密钥管理算法的支持

现在 Keycloak 允许将 ECDH-ES、ECDH-ES+A128KW、ECDH-ES+A192KW 或 ECDH-ES+A256KW 配置为客户端的加密密钥管理算法。使用椭圆曲线 Diffie-Hellman 瞬态静态 (ECDH-ES) 的密钥协商规范为 JWT 引入了三个新的标头参数:epkapuapv。当前 Keycloak 实现仅管理强制的 epk,而另外两个(可选)从未添加到标头中。有关这些算法的更多信息,请参阅 JSON Web 算法 (JWA)

此外,新的密钥提供程序 ecdh-generated 可用于生成领域密钥,并且 Java KeyStore 提供程序中添加了对 ECDH 算法的支持。

非常感谢 Justin Tay 的贡献。

支持在领域中使用多个社交代理实例

现在可以在一个领域中拥有多个相同社交代理的实例。

大多数时候,一个领域不需要多个相同社交代理的实例。但由于引入了 organization 功能,因此应该可以将同一社交代理的不同实例链接到不同的组织。

创建社交代理时,现在应该像任何其他代理一样提供一个 Alias,并可以选择提供一个 Display name

用于凭据的新通用事件类型

现在有用于更新 (UPDATE_CREDENTIAL) 和删除 (REMOVE_CREDENTIAL) 凭据的通用事件。凭据类型在事件的 credential_type 属性中描述。新的事件类型受电子邮件事件侦听器支持。

以下事件类型现已过时,将在未来版本中删除:UPDATE_PASSWORDUPDATE_PASSWORD_ERRORUPDATE_TOTPUPDATE_TOTP_ERRORREMOVE_TOTPREMOVE_TOTP_ERROR

base/loginkeycloak.v2/login 主题中的 template.ftl 文件现在允许自定义登录框的页脚。这可用于显示常用链接或在页面末尾包含自定义脚本。

新的 footer.ftl 模板提供了一个 content 宏,它在“登录框”的底部呈现。

Keycloak CR 支持标准调度选项

Keycloak CR 现在公开了一流的属性,用于控制 Keycloak Pod 的调度。

有关更多详细信息,请参阅 操作员高级配置

KeycloakRealmImport CR 支持占位符替换

KeycloakRealmImport CR 现在公开 spec.placeholders 以创建用于在导入中替换占位符的环境变量。

有关更多详细信息,请参阅 操作员领域导入

配置 LDAP 连接池

在此版本中,LDAP 连接池配置完全依赖于系统属性。

有关更多详细信息,请参阅 配置连接池

Infinispan 序列化更改为 Infinispan Protostream

序列化是将 Java 对象转换为字节以在 Keycloak 服务器之间跨网络发送它们的进程。在 Keycloak 26 中,我们将序列化格式从 JBoss 序列化更改为 Infinispan Protostream。

JBoss 序列化和 Infinispan Protostream 彼此不兼容,使用不当可能会导致数据丢失。因此,升级到此版本时会清除所有缓存。

Infinispan Protostream 基于 协议缓冲区 (proto 3),它具有向后/向前兼容的优点。

删除 OSGi 元数据

由于所有使用 OSGi 元数据的 Java 适配器都已删除,因此我们已停止为我们的 jar 生成 OSGi 元数据。

为了提高组的可扩展性,现在在删除领域时直接从数据库中删除组。因此,在删除领域时不再触发与组相关的事件,例如 GroupRemovedEvent

有关如何迁移的信息,请参阅 升级指南

身份提供者不再从领域表示中提供

作为对 realm 和组织在拥有众多身份提供者时的可扩展性改进的一部分,realm 表示不再包含身份提供者列表。但是,在导出 realm 时,它们仍然可以通过 realm 表示获取。

有关如何迁移的信息,请参阅 升级指南

安全应用程序文档转换为指南格式

安全应用程序和服务文档已转换为与先前版本中转换的服务器安装和配置文档类似的新格式。该文档现在可在Keycloak 指南中找到。

删除旧版 Cookie

Keycloak 不再发送_LEGACY Cookie,这些 Cookie 是作为对不支持 Cookie 上SameSite 标志的旧版浏览器的解决方法引入的。

_LEGACY Cookie 还用于另一个目的,即允许从不安全上下文中登录。尽管在 Keycloak 的生产部署中完全不建议这样做,但在localhost之外通过http访问 Keycloak 却相当普遍。作为_LEGACY Cookie 的替代方案,Keycloak 现在在检测到使用不安全上下文时,不会设置secure 标志,而是设置SameSite=Lax,而不是SameSite=None

UserRepresentation 中的属性origin 已弃用

UserRepresentation 中的origin 属性已弃用,并计划在将来的版本中删除。

改为使用federationLink 属性来获取用户链接到的提供者。

Keycloak 25.0.0

账户控制台 v2 主题已删除

账户控制台 v2 主题已从 Keycloak 中删除。该主题在 Keycloak 24 中被弃用,并被账户控制台 v3 主题取代。如果您仍在使用该主题,则应迁移到账户控制台 v3 主题。

Java 21 支持

Keycloak 现在支持 OpenJDK 21,因为我们希望坚持使用最新的 LTS OpenJDK 版本。

Java 17 支持已弃用

OpenJDK 17 支持在 Keycloak 中被弃用,并将被删除在接下来的版本中,以支持 OpenJDK 21。

大多数 Java 适配器已删除

正如先前 Keycloak 版本的发布说明中所述,大多数 Java 适配器现在已从 Keycloak 代码库和下载页面中删除。

对于 OAuth 2.0/OIDC,这包括删除 Tomcat 适配器、WildFly/EAP 适配器、Servlet 过滤器适配器、KeycloakInstalled 桌面适配器、jaxrs-oauth-client 适配器、JAAS 登录模块、Spring 适配器和 SpringBoot 适配器。您可以查看我们之前的文章以了解一些替代方案的列表。

对于 SAML,这包括删除 Tomcat 适配器和 Servlet 过滤器适配器。SAML 适配器仍然支持 WildFly 和 JBoss EAP。

通用的授权客户端库仍然受支持,我们仍然计划支持它。它的目标是与任何其他 OAuth 2.0 或 OpenID Connect 库结合使用。您可以查看快速入门,了解使用授权客户端库与第三方 Java 适配器(如 Elytron OIDC 或 SpringBoot)结合使用的示例。您还可以查看快速入门中有关使用 WildFly 的 SAML 适配器示例。

升级到 PatternFly 5

在 Keycloak 24 中,欢迎页面已更新为使用PatternFly 5,这是 Keycloak 用户界面基础设计系统的最新版本。在此版本中,管理控制台和账户控制台也已更新为使用 PatternFly 5。如果您想扩展和自定义管理控制台和账户控制台,请查看PatternFly 5 中的更改,并相应地更新您的自定义项。

Argon2 密码哈希

Argon2 现在是 Keycloak 在非 FIPS 环境中使用的默认密码哈希算法。

Argon2 是2015 年密码哈希竞赛的获胜者,并且是OWASP 推荐的哈希算法。

在 Keycloak 24 中,PBKDF2 的默认哈希迭代次数从 27.5K 增加到 210K,导致生成密码哈希所需的 CPU 时间增加了 10 倍以上。使用 Argon2,可以以几乎与先前版本的 Keycloak 相同的 CPU 时间实现更好的安全性。一个缺点是 Argon2 需要更多内存,这是抵御 GPU 攻击的必要条件。Keycloak 中 Argon2 的默认设置每个哈希请求需要 7MB 的内存。为了防止过度使用内存和 CPU,Argon2 对哈希的并行计算默认限制为 JVM 可用的核心数。为了支持 Argon2 的内存密集型特性,我们已将默认 GC 从 ParallelGC 更新为 G1GC,以便更好地利用堆内存。

请注意,Argon2 不符合 FIPS 140-2。因此,如果您在 FIPS 环境中,默认算法仍然是 PBKDF2。还要注意,如果您在非 FIPS 环境中,并且计划迁移到 FIPS 环境,请考虑在一开始就将密码策略更改为符合 FIPS 的算法,例如pbkdf2-sha512。否则,用户在切换到 FIPS 环境后将无法登录。

新的主机名选项

为了应对先前主机名配置设置所带来的复杂性和缺乏直观性,我们很荣幸地推出主机名 v2 选项。

我们倾听了您的反馈,解决了棘手的问题,并为管理主机名配置创造了更流畅的体验。请注意,即使这些选项背后的行为也已发生变化,并且需要您注意 - 如果您正在处理自定义主机名设置。

主机名 v2 选项默认支持,因为旧的主机名选项已弃用,将在接下来的版本中删除。您应尽快迁移到它们。

新选项默认激活,因此 Keycloak 不会识别旧选项。

有关如何迁移的信息,请参阅 升级指南

持久用户会话

先前版本的 Keycloak 仅将离线用户和离线客户端会话存储在数据库中。新功能persistent-user-sessions 不仅将在线用户会话和在线客户端会话存储在内存中,还存储在数据库中。这将允许用户即使 Keycloak 的所有实例都重新启动或升级,也能保持登录状态。

该功能是一个预览功能,默认情况下处于禁用状态。要使用它,请将以下内容添加到您的构建命令中

bin/kc.sh build --features=persistent-user-sessions ...

有关更多详细信息,请参阅启用和禁用功能指南。大小调整指南包含一个新段落,描述启用该功能时的更新资源要求。

有关如何升级的信息,请参阅 升级指南

Cookie 更新

为所有 Cookie 设置 SameSite 属性

以下 Cookie 以前未使用过SameSite 属性,这在最近的浏览器版本中会导致它们默认使用SameSite=Lax

  • KC_STATE_CHECKER 现在设置SameSite=Strict

  • KC_RESTART 现在设置SameSite=None

  • KEYCLOAK_LOCALE 现在设置SameSite=None

  • KEYCLOAK_REMEMBER_ME 现在设置SameSite=None

默认值SameSite=Lax 会导致基于 POST 的绑定出现问题,这主要适用于 SAML,但也用于一些 OpenID Connect/OAuth 2.0 流。

KC_AUTH_STATE Cookie 已被删除,并且不再由 Keycloak 服务器设置,因为该服务器不再需要此 Cookie。

以下用于设置自定义 Cookie 的 API 已被删除

  • ServerCookie - 已被NewCookie.Builder取代

  • LocaleSelectorProvider.KEYCLOAK_LOCALE - 已被CookieType.LOCALE取代

  • HttpCookie - 已被NewCookie.Builder取代

  • HttpResponse.setCookieIfAbsent(HttpCookie cookie) - 已被HttpResponse.setCookieIfAbsent(NewCookie cookie)取代

解决了针对已过期的身份验证会话的“您已登录”问题

Keycloak 23 版本提供了当用户在多个浏览器选项卡中并行进行身份验证时的改进。但是,此改进并未解决身份验证会话过期的情况。现在,对于用户已在一个浏览器选项卡中登录,而在其他浏览器选项卡中身份验证会话已过期的情况,Keycloak 能够使用 OIDC/SAML 错误重定向回客户端应用程序,以便客户端应用程序可以立即重试身份验证,这通常会自动登录应用程序,因为 SSO 会话的存在。有关更多详细信息,请参阅服务器管理指南身份验证会话

轻量级访问令牌变得更加轻量级

在以前的版本中,添加了对轻量级访问令牌的支持。在此版本中,我们设法从轻量级访问令牌中删除了更多内置声明。这些声明是由协议映射器添加的。其中一些甚至会影响常规访问令牌或 ID 令牌,因为它们不是 OIDC 规范严格要求的。

  • 声明subauth_time 现在由协议映射器添加,这些映射器默认配置在新的客户端范围basic 上,该范围会自动添加到所有客户端。这些声明仍然像以前一样添加到 ID 令牌和访问令牌中,但不会添加到轻量级访问令牌中。

  • 声明nonce 现在仅添加到 ID 令牌。它不会添加到常规访问令牌或轻量级访问令牌。为了向后兼容,您可以通过协议映射器将此声明添加到访问令牌中,该映射器需要显式配置。

  • 声明session_state 现在不会添加到任何令牌中。如果需要,仍然可以通过协议映射器添加它。规范仍然支持另一个专用声明sid,该声明在先前版本中也可用,并且具有完全相同的值。

有关更多详细信息,请参阅升级指南

在令牌自省端点中支持 application/jwt 媒体类型

在调用令牌自省端点时,您可以使用 HTTP 标头Accept: application/jwt。当为特定客户端启用时,它会从令牌自省端点返回一个声明jwt,其中包含完整的 JWT 访问令牌,这对于客户端调用自省端点使用轻量级访问令牌的用例尤其有用。感谢Thomas Darimont 的贡献。

检查密码是否包含用户名密码策略

Keycloak 支持一项新的密码策略,允许您拒绝包含用户用户名在内的用户密码。

必需操作改进

在管理控制台中,您现在可以在特定领域的“必需操作”选项卡中配置一些必需操作。目前,**更新密码**是唯一内置的可配置必需操作。它支持设置**身份验证最大期限**,即用户在未重新验证的情况下(例如,在更新帐户控制台中的密码时)通过 `kc_action` 参数(用于实例)更新密码的最大时间。必需操作的排序也得到了改进。当身份验证期间有多个必需操作时,所有操作将一起排序,无论这些操作是在身份验证期间设置的(例如,通过 `kc_action` 参数)还是由管理员手动添加到用户帐户的。感谢 Thomas DarimontDaniel Fesenmeyer 的贡献。

通行密钥改进

添加了对通行密钥条件 UI 的支持。当启用通行密钥预览功能时,将提供一个专用身份验证器,这意味着您可以从可用通行密钥帐户列表中进行选择并根据该帐户对用户进行身份验证。感谢 Takashi Norimatsu 的贡献。

SAML 的默认客户端配置文件

添加了默认客户端配置文件以确保 SAML 客户端的安全。在管理控制台中浏览领域的客户端策略时,您将看到一个新的客户端配置文件 `saml-security-profile`。使用它时,将对 SAML 客户端应用安全最佳实践,例如强制执行签名、禁用 SAML 重定向绑定以及禁止通配符重定向 URL。

添加了新的身份验证器 `Confirm override existing link`。此身份验证器允许覆盖与 Keycloak 用户关联的 IDP 用户名,该用户之前已与不同的 IDP 身份关联。有关更多详细信息,请参阅 服务器管理指南。感谢 Lex Cao 的贡献。

OpenID 用于可验证凭证签发 - 实验性支持

OpenID 用于可验证凭证签发 (OID4VCI) 的支持正在开发中。目前,这仍然是一个正在进行的工作,但正在逐渐添加内容。Keycloak 可以充当 OID4VC 发行者,支持预授权代码流程。JWT-VC、SD-JWT-VC 和 VCDM 格式的可验证凭证均受支持。感谢 OAuth SIG 小组成员的贡献和反馈,尤其是感谢 Stefan WiedemannFrancis PouatchaTakashi NorimatsuYutaka Obuchi

按用户属性搜索不再区分大小写

按用户属性搜索用户时,Keycloak 不再搜索用户属性名称,从而强制执行小写比较。此更改的目的是通过使用 Keycloak 在用户属性表上的本机索引来加快搜索速度。如果您的数据库排序规则不区分大小写,您的搜索结果将保持不变。如果您的数据库排序规则区分大小写,您可能会看到比以前更少的搜索结果。

授权客户端库中的重大修复

对于 `keycloak-authz-client` 库的用户,调用 `AuthorizationResource.getPermissions(…​)` 现在会正确地返回一个 `List<Permission>`。

以前,它会在运行时返回一个 `List<Map>`,即使方法声明宣传的是 `List<Permission>`。

此修复程序将破坏依赖于将 List 或其内容强制转换为 `List<Map>` 的代码。如果您在任何情况下使用过此方法,您很可能已经执行过此操作并且会受到影响。

导出客户端的授权设置时不再设置 ID

导出客户端的授权设置时,资源、范围和策略的 ID 不再设置。因此,您现在可以将设置从一个客户端导入到另一个客户端。

度量和运行状况端点的管理端口

度量和运行状况检查端点不再通过标准 Keycloak 服务器端口访问。由于这些端点应该对外部世界隐藏,因此可以通过单独的默认管理端口 `9000` 访问它们。

它允许在 Kubernetes 环境中不将它公开给用户作为标准 Keycloak 端点。新的管理界面提供了一套新的选项,并且可以完全配置。

Keycloak Operator 假定默认情况下管理界面已打开。有关更多详细信息,请参阅 配置管理界面

用于远程日志记录的 Syslog

Keycloak 现在支持用于远程日志记录的 Syslog 协议。它使用在 RFC 5424 中定义的协议。默认情况下,syslog 处理程序处于禁用状态,但启用后,它会将所有日志事件发送到远程 syslog 服务器。

有关更多信息,请参阅 配置日志记录 指南。

对类 `EnvironmentDependentProviderFactory` 的更改

方法 `EnvironmentDependentProviderFactory.isSupported()` 已在几个版本中弃用,现在已删除。

有关更多详细信息,请参阅 升级指南

所有 `cache` 选项都是运行时选项

现在可以在运行时指定 `cache`、`cache-stack` 和 `cache-config-file` 选项。这消除了由于它们而执行构建阶段并重新构建映像的需要。

有关更多详细信息,请参阅 升级指南

高可用性指南增强

高可用性指南现在包含有关如何配置 AWS Lambda 以防止从备份站点到主站点的预期自动故障转移的指南。

从 `AccessToken`、`IDToken` 和 `JsonWebToken` 类中删除已弃用的方法

在此版本中,我们最终将从以下类中删除已弃用的方法

  • AccessToken

  • IDToken

  • JsonWebToken

有关更多详细信息,请参阅 升级指南

方法 `getExp` 添加到 `SingleUseObjectKeyModel`

由于从 `AccessToken`、`IDToken` 和 `JsonWebToken` 中删除了已弃用的方法,因此 `SingleUseObjectKeyModel` 也发生了更改,以保持与与到期值相关的函数名的一致性。

有关更多详细信息,请参阅 升级指南

支持 PostgreSQL 16

受支持和经过测试的数据库现在包括 PostgreSQL 16。

介绍对客户身份和访问管理 (CIAM) 和多租户的支持

在此版本中,我们正在提供 Keycloak 组织作为一项技术预览功能。

此功能为领域提供了一些核心 CIAM 功能,它将作为将来更多功能的基础,以解决企业对企业 (B2B) 和企业对企业对客户 (B2B2C) 的用例。

就功能而言,该功能已完成。但是,我们仍然需要做一些工作才能在下一个主要版本中使其完全受支持。这项剩余的工作主要是关于为生产部署准备功能,重点是可扩展性。此外,根据我们收到下一个主要版本之前的反馈,我们最终可能会接受其他功能并为该功能增加更多价值,而不会影响其路线图。

有关更多详细信息,请参阅 服务器管理指南

Keycloak 24.0.5

使用基于 `client_secret_post` 的身份验证的 PAR 客户端的安全问题

此版本包含影响一些使用 PAR(推送授权请求)的 OIDC 机密客户端的重要安全问题的修复。如果您将 OIDC 机密客户端与 PAR 结合使用,并且使用基于 `client_id` 和 `client_secret` 的客户端身份验证(作为 HTTP 请求正文中的参数发送,`client_secret_post` 方法在 OIDC 规范中指定),强烈建议您在升级到此版本后轮换客户端密钥。

Keycloak 24.0.4

通过管理用户 API 更新用户时,对用户属性进行部分更新不再受支持

通过管理用户 API 更新用户属性时,您无法在更新用户属性时执行部分更新,包括 `username`、`email`、`firstName` 和 `lastName` 等根属性。

有关更多详细信息,请参阅 升级指南

Keycloak 24.0.1

运算符部署的是夜间构建,而不是 24.0.0

由于使用运算符部署 Keycloak 时在发布过程中出现问题,因此它安装了 `nightly` 容器,而不是 `24.0.0`。

作为对该问题的快速修复,`24.0.0` 容器已标记为 `nightly`,并且 `nightly` 版本已暂时禁用。

如果您在昨天中欧时间下午 5 点之前使用运算符安装或升级到 `24.0.0`,则数据库可能已使用错误的版本更新。要检查您是否受到影响,请连接到您的数据库并运行以下 SQL 命令

SELECT * from migration_model WHERE version = '999.0.0';

如果以上返回匹配的行,您需要采取一些操作,否则数据库迁移将不会为将来的版本运行。要解决此问题,请运行以下 SQL 命令

UPDATE migration_model SET version = '24.0.0' WHERE version = '999.0.0';

Keycloak 24.0.0

支持的用户配置文件和渐进式配置

用户配置文件预览功能已升级为完全支持,并且用户配置文件默认启用。

在过去几个月里,Keycloak 团队花费了大量精力来完善用户配置文件功能,使其完全受支持。在此版本中,我们继续了这项工作。根据我们出色的社区的全面测试和反馈,进行了许多改进、修复和完善。

以下是此功能的一些亮点;

  • 对用户和管理员可以管理的属性进行细粒度控制,以便您可以防止设置意外的属性和值。

  • 能够指定哪些用户属性是管理的,并且应该在表单上显示给普通用户或管理员。

  • 动态表单 - 以前,用户创建或更新其配置文件的表单包含四个基本属性,例如用户名、电子邮件、姓氏和名字。添加任何属性(或删除一些默认属性)都需要您创建一个自定义主题。现在可能不需要自定义主题,因为用户会根据特定部署的要求看到完全请求的属性。

  • 验证 - 能够为用户属性指定验证器,包括您可以用来指定最大或最小长度、特定正则表达式或将特定属性限制为 URL 或数字的内置验证器。

  • 注释 - 能够指定应将特定属性渲染为文本区域、带有指定选项的 HTML 选择、日历或许多其他选项。您还可以将 JavaScript 代码绑定到特定字段以更改属性的渲染方式并自定义其行为。

  • 渐进式用户画像 - 允许您指定某些字段仅在scope参数具有特定值时才在表单中必填或可用。这有效地实现了渐进式用户画像。您不再需要在注册时就向用户询问二十个属性;您可以改为根据用户使用的各个客户端应用程序的要求,逐步向用户询问属性。

  • 从旧版本迁移 - 用户画像现在始终启用,但对于未使用此功能的用户来说,其操作方式与以前相同。您可以享受用户画像功能带来的益处,但无需使用它们。有关迁移说明,请参阅升级指南

用户画像作为支持功能的首次发布仅仅是起点,为提供更多关于身份管理的功能奠定了基础。

我们衷心感谢Keycloak社区的贡献,因为许多想法、需求和贡献都来自社区!特别感谢

有关用户画像功能的更多详细信息,请参阅服务器管理指南

对用户画像SPI的重大更改

在此版本中,对用户画像SPI的更改可能会影响基于此SPI的现有实现。有关更多详细信息,请参阅升级指南

对基于用户画像和领域的页面渲染的Freemarker模板的更改

在此版本中,以下模板已更新,以便能够根据为领域设置的用户画像配置动态渲染属性

  • login-update-profile.ftl

  • register.ftl

  • update-email.ftl

有关更多详细信息,请参阅 升级指南

首次通过代理登录时用于更新用户画像页面的新Freemarker模板

在此版本中,当用户首次通过代理进行身份验证时,服务器将使用idp-review-user-profile.ftl模板渲染更新用户画像页面。

有关更多详细信息,请参阅 升级指南

Java适配器弃用和删除

早在2022年,我们就宣布了在Keycloak 19中弃用Keycloak适配器。为了给社区更多时间采用,这项计划被推迟了

考虑到这一点,这将是Keycloak的最后一个包含OpenID Connect和SAML适配器的主要版本。由于Jetty 9.x自2022年以来一直不受支持,因此Jetty适配器已在此版本中被删除。

通用授权客户端库将继续得到支持,旨在与任何其他OAuth 2.0或OpenID Connect库结合使用。

我们将继续提供的唯一适配器是适用于最新版本WildFly和EAP 8.x的SAML适配器。继续支持此适配器的原因是,Keycloak中大部分SAML代码库来自WildFly的贡献。作为这项贡献的一部分,我们同意长期维护WildFly和EAP的SAML适配器。

Jetty适配器已删除

Jetty 9.4在社区中很长时间以来一直不受支持,并在2022年达到生命周期结束。同时,适配器没有更新,也没有在Jetty的更新版本中进行测试。出于这些原因,Jetty适配器已从此版本中删除。

新的欢迎页面

首次使用Keycloak时出现的“欢迎”页面已重新设计。它提供了更好的设置体验,并符合最新版本的PatternFly。简化的页面布局仅包含一个用于注册第一个管理用户的表单。完成注册后,用户将直接被发送到管理控制台。

如果您使用的是自定义主题,您可能需要更新它以支持新的欢迎页面。有关详细信息,请参阅升级指南

新的账户控制台现已成为默认控制台

我们在Keycloak 22中以预览功能的形式引入了第3版账户控制台。在此版本中,我们将它设置为默认版本,并在此过程中弃用了第2版,第2版将在后续版本中被删除。

这个新版本内置支持用户画像功能,允许管理员配置账户控制台中可供用户使用的属性,并在用户登录后直接将其带到他们的个人账户页面。

如果您使用或扩展了此主题的自定义功能,您可能需要执行其他迁移操作。有关更多详细信息,请参阅升级指南

Keycloak JS

package.json中使用exports字段

Keycloak JS适配器现在在它的package.json中使用exports字段。此更改改善了对Webpack 5和Vite等更现代打包器的支持,但会带来一些不可避免的重大更改。有关更多详细信息,请参阅升级指南

默认情况下启用PKCE

Keycloak JS适配器现在默认情况下将pkceMethod选项设置为S256。此更改为使用适配器的所有应用程序启用了Proof Key Code Exchange(PKCE)。如果您在不支持PKCE的系统上使用适配器,您可以将pkceMethod选项设置为false以禁用它。

对密码散列的更改

在此版本中,我们调整了密码散列默认值,以符合OWASP密码存储建议

作为此更改的一部分,默认密码散列提供程序已从pbkdf2-sha256更改为pbkdf2-sha512。此外,基于pbkdf2的密码散列算法的默认散列迭代次数也有所改变。此更改意味着更符合最新建议的安全性,但会影响性能。通过在您的领域中添加密码策略hashAlgorithmhashIterations,您可以保持旧的行为。有关更多详细信息,请参阅升级指南

轻量级访问令牌支持

此版本包含对轻量级访问令牌的支持。因此,您可以为指定的客户端提供更小的访问令牌。这些令牌只包含几个声明,因此它们更小。请注意,轻量级访问令牌默认情况下仍由领域密钥签署的JWT,并且仍然包含一些非常基本的声明。

此版本引入了一个**添加到轻量级访问令牌**标志,它在某些OIDC协议映射器上可用。使用此标志指定是否应将特定声明添加到轻量级访问令牌中。它默认情况下为**关闭**,这意味着大多数声明都不会被添加。

此外,还存在一个客户端策略执行器。使用它来指定特定客户端请求是否应该使用轻量级访问令牌或常规访问令牌。执行器的替代方法是使用客户端高级设置中的**始终使用轻量级访问令牌**标志,这将导致该客户端始终使用轻量级访问令牌。如果您需要更多灵活性,执行器可以作为替代方法。例如,您可能选择默认使用轻量级访问令牌,但仅针对指定的**scope**参数使用常规令牌。

之前的版本添加了一个**添加到令牌自省**开关。您使用它将不在访问令牌中存在的声明添加到自省端点响应中。

感谢Shigeyuki Kabano的贡献,并感谢Takashi Norimatsu对这项功能的帮助和审查。

OAuth 2.1支持

此版本包含可选的OAuth 2.1支持。此版本中引入了新的客户端策略配置文件,管理员可以使用它们来确保客户端和特定客户端请求符合OAuth 2.1规范。为机密客户端和公开客户端提供了一个专门的客户端配置文件。感谢Takashi NorimatsuShigeyuki Kabano的贡献。

在刷新令牌流中支持scope参数

从这个版本开始,支持OAuth2/OIDC端点中用于令牌刷新的**scope**参数。使用此参数请求具有比最初授予的更少范围的访问令牌,这意味着您无法增加访问令牌的范围。此范围限制不影响已刷新的刷新令牌的范围。此功能按OAuth2规范中所述的方式工作。感谢Konstantinos Georgilakis的贡献。

用于安全重定向URI的客户端策略执行器

引入了一个新的客户端策略执行器secure-redirect-uris-enforcer。使用它来限制客户端可以使用哪些重定向URI。例如,您可以指定客户端重定向URI不能包含通配符,应该只来自特定域,必须符合OAuth 2.1,等等。感谢Lex CaoTakashi Norimatsu的贡献。

用于强制执行DPoP的客户端策略执行器

引入了一个新的客户端策略执行器dpop-bind-enforcer。如果启用了dpop预览,您可以使用它来强制执行特定客户端的DPoP。感谢Takashi Norimatsu的贡献。

支持EdDSA

您可以创建EdDSA领域密钥,并将它们用作各种客户端的签名算法。例如,您可以使用这些密钥来签署令牌或用于使用已签名的JWT进行客户端身份验证。此功能包括身份代理,其中Keycloak本身签署用于private_key_jwt身份验证到第三方身份提供者的客户端断言。感谢Takashi NorimatsuMuhammad Zakwan Bin Mohd Zahid的贡献。

JavaKeystore提供程序支持EC密钥

用于提供领域密钥的提供程序JavaKeystoreProvider现在除了以前支持的RSA密钥外,还支持EC密钥。感谢Stefan Wiedemann的贡献。

使用私钥签署的JWT进行身份验证时,将X509指纹添加到JWT的选项

OIDC身份提供者现在为使用私钥签署的JWT进行客户端身份验证的情况提供了**将X.509标头添加到JWT**选项。此选项对于与某些身份提供者(例如Azure AD)的互操作性可能很有用,Azure AD要求指纹存在于JWT中。感谢MT的贡献。

OAuth授权类型SPI

Keycloak代码库包含一项内部更新,以引入OAuth授权类型SPI。此更新允许在引入Keycloak OAuth 2令牌端点支持的自定义授权类型时提供额外的灵活性。感谢Dmitry Telegin的贡献。

CORS改进

与CORS相关的Keycloak功能已提取到SPI中,这可以提供额外的灵活性。请注意,CorsSPI是内部的,可能会在将来的版本中发生更改。感谢Dmitry Telegin的贡献。

信任库改进

Keycloak 引入了改进的信任库配置选项。Keycloak 信任库现在用于整个服务器,包括传出连接、mTLS 和数据库驱动程序。您不再需要为各个区域配置单独的信任库。要配置信任库,您可以将信任库文件或证书放在默认的 conf/truststores 中,或者使用新的 truststore-paths 配置选项。有关详细信息,请参阅相关指南

版本化功能

功能现在支持版本控制。为了保持向后兼容性,所有现有的功能(包括 account2account3)都被标记为版本 1。新引入的功能将使用版本控制,这意味着用户可以选择所需功能的不同实现。

有关详细信息,请参阅功能指南

Keycloak CR 信任库

您还可以利用 Keycloak CR 对信任库的新的服务器端处理,例如

spec:
  truststores:
    mystore:
      secret:
        name: mystore-secret
    myotherstore:
      secret:
        name: myotherstore-secret

目前仅支持 Secrets。

信任 Kubernetes CA

Kubernetes CA 的证书会自动添加到由 Operator 管理的 Keycloak Pod 中。

SAML 身份提供者的自动证书管理

SAML 身份提供者现在可以配置为自动从 IDP 实体元数据描述符端点下载签名证书。为了使用新功能,请在提供者中配置 Metadata descriptor URL 选项(发布证书的 IDP 元数据信息的 URL),并将 Use metadata descriptor URL 设置为 ON。证书会从该 URL 自动下载并缓存在 public-key-storage SPI 中。还可以使用提供者页面中的操作组合,从管理控制台重新加载或导入证书。

有关新选项的更多详细信息,请参阅文档

用于负载均衡器的非阻塞健康检查

添加了一个新的健康检查端点,位于 /lb-check。执行在事件循环中运行,这意味着即使在 Keycloak 需要处理请求队列中许多请求的负载过重的情况下,此检查也是响应的。例如,在多站点部署中,此行为有助于避免故障转移到负载过重的另一个站点。该端点目前正在检查嵌入式和外部 Infinispan 缓存的可用性。以后可能会添加其他检查。

此端点默认不可用。要启用它,请使用 multi-site 功能运行 Keycloak。有关详细信息,请参阅启用和禁用功能

Keycloak CR 优化字段

Keycloak CR 现在包含一个 startOptimized 字段,可用于覆盖关于是否为启动命令使用 --optimized 标志的默认假设。因此,即使使用自定义 Keycloak 镜像,您也可以使用 CR 配置构建时间选项。

增强的反向代理设置

现在可以使用新的 --proxy-headers 选项分别启用解析 ForwardedX-Forwarded-* 标头。有关详细信息,请参阅反向代理指南。原始的 --proxy 选项现已弃用,将在将来的版本中删除。有关迁移说明,请参阅升级指南

对管理员 API 和帐户上下文中的用户表示的更改

在此版本中,我们通过将根用户属性(如 usernameemailfirstNamelastNamelocale)移动到一个基础/抽象类来封装它们,以使使用管理员和帐户 REST API 时这些属性的编组和解组方式保持一致。

此策略确保了客户端管理属性的方式的一致性,并确保它们符合设置为领域的配置文件。

有关更多详细信息,请参阅 升级指南

离线会话和远程会话的顺序加载

从本版本开始,Keycloak 集群的第一个成员将顺序加载远程会话,而不是并行加载。如果启用了离线会话预加载,它们也将顺序加载。

有关更多详细信息,请参阅 升级指南

不再可能代表其他已验证用户执行操作

在此版本中,如果用户已验证,并且操作绑定到另一个用户,您将无法再执行电子邮件验证等操作。例如,如果电子邮件链接绑定到不同的帐户,用户将无法完成电子邮件验证流程。

对电子邮件验证流程的更改

在此版本中,如果用户尝试按照链接验证电子邮件,并且之前已验证电子邮件,则会显示一条适当的消息。

除此之外,还会触发一个新的错误 (EMAIL_ALREADY_VERIFIED) 事件,以指示尝试验证已验证的电子邮件。您可以使用此事件来跟踪在链接泄露的情况下可能存在劫持用户帐户的企图,或者在用户不认识该操作时提醒用户。

已弃用的离线会话预加载

Keycloak 的默认行为是在需要时加载离线会话。在启动时预加载它们的旧行为现在已弃用,因为在启动时预加载它们在会话数量不断增加的情况下无法很好地扩展,并且会增加 Keycloak 的内存使用量。旧行为将在将来的版本中删除。

有关更多详细信息,请参阅 升级指南

用于离线会话在内存中生存期覆盖的配置选项

为了减少内存需求,我们引入了一个配置选项来缩短导入到 Infinispan 缓存中的离线会话的生存期。目前,离线会话生存期覆盖默认情况下处于禁用状态。

有关详细信息,请参阅服务器管理指南

Infinispan 指标使用标签表示缓存管理器和缓存名称

启用 Keycloak 嵌入式缓存的指标时,指标现在使用标签表示缓存管理器和缓存名称。

有关更多详细信息,请参阅 升级指南

用户属性值长度扩展

从本版本开始,Keycloak 支持存储和按用户属性值进行搜索,这些属性值长度超过 255 个字符,而这以前是限制。

有关更多详细信息,请参阅 升级指南

暴力破解保护更改

暴力破解保护进行了一些增强

  1. 如果由于暴力破解保护,使用 OTP 或恢复代码进行身份验证的尝试失败,则活动身份验证会话将失效。任何进一步使用该会话进行身份验证的尝试都将失败。

  2. 在以前的 Keycloak 版本中,管理员必须在禁用用户是暂时禁用还是永久禁用之间进行选择,原因是攻击者对用户帐户的暴力破解攻击。管理员现在可以在用户帐户被暂时锁定一定次数后永久禁用该用户。

  3. failedLoginNotBefore 属性已添加到 brute-force/users/{userId} 端点

授权策略

在以前的 Keycloak 版本中,如果用户、组或客户端策略的最后一个成员被删除,则该策略也将被删除。不幸的是,这会导致特权升级,如果策略用于聚合策略。为了避免特权升级,效果策略将不再被删除,管理员需要更新这些策略。

Keycloak CR 缓存配置文件选项

Keycloak CR 现在允许使用 cache spec configMapFile 字段指定 cache-config-file 选项,例如

apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
  name: example-kc
spec:
  ...
  cache:
    configMapFile:
      name: my-configmap
      key: config.xml

Keycloak CR 资源选项

Keycloak CR 现在允许为管理 Keycloak 容器的计算资源指定 resources 选项。它提供了通过 Keycloak CR 为主要 Keycloak 部署独立请求和限制资源,以及通过 Realm 导入 CR 为领域导入作业请求和限制资源的能力。

当未指定任何值时,默认的 requests 内存设置为 1700MiBlimits 内存设置为 2GiB

您可以根据自己的要求指定自定义值,如下所示

apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
  name: example-kc
spec:
  ...
  resources:
    requests:
      cpu: 1200m
      memory: 896Mi
    limits:
      cpu: 6
      memory: 3Gi

有关详细信息,请参阅Operator 高级配置

临时锁定日志被事件取代

当用户因暴力破解保护器而被暂时锁定时,现在会出现一个新的事件 USER_DISABLED_BY_TEMPORARY_LOCKOUT。已删除 ID 为 KC-SERVICES0053 的日志,因为新事件以结构化形式提供信息。

有关更多详细信息,请参阅 升级指南

对 cookie 的更新

cookie 处理代码已重构和改进,包括一个新的 Cookie 提供者。这为 Keycloak 处理的 cookie 提供了更好的一致性,以及在需要时引入有关 cookie 的配置选项的能力。

用于 NameID 的 SAML 用户属性映射器现在仅建议有效的 NameID 格式

用于 NameID 的用户属性映射器允许将 Name ID Format 选项设置为以下值

  • urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName

  • urn:oasis:names:tc:SAML:1.1:nameid-format:WindowsDomainQualifiedName

  • urn:oasis:names:tc:SAML:2.0:nameid-format:kerberos

  • urn:oasis:names:tc:SAML:2.0:nameid-format:entity

但是,Keycloak 不支持接收包含其中一个 NameIDPolicyAuthnRequest 文档,因此这些映射器将永远不会被使用。支持的选项已更新,仅包含以下 Name ID 格式

  • urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress

  • urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified

  • urn:oasis:names:tc:SAML:2.0:nameid-format:persistent

  • urn:oasis:names:tc:SAML:2.0:nameid-format:transient

在容器中运行时,不同的 JVM 内存设置

Keycloak 不再为初始堆大小和最大堆大小指定硬编码值,而是使用相对于容器总内存的相对值。JVM 选项 -Xms-Xmx-XX:InitialRAMPercentage-XX:MaxRAMPercentage 替换。

这可能会显着影响内存使用量,因此可能需要执行某些操作。

有关更多详细信息,请参阅 升级指南

GELF 日志处理程序已弃用

随着提供与 GELF 集成的基础库的停用,Keycloak 将不再开箱即用地支持 GELF 日志处理程序。此功能将在将来的版本中删除。如果您需要外部日志管理,请考虑使用文件日志解析。

支持多站点活动-被动部署

将 Keycloak 部署到多个独立站点对于某些环境至关重要,以便提供高可用性和快速恢复故障。此版本支持 Keycloak 的活动-被动部署。

要开始使用,请使用高可用性指南,其中还包括一个综合蓝图,用于将高可用性 Keycloak 部署到云环境。

Keycloak 23.0.0

OpenID Connect / OAuth 2.0

FAPI 2 草案支持

Keycloak 现在有了新的客户端配置文件 fapi-2-security-profilefapi-2-message-signing,它们确保 Keycloak 在与您的客户端通信时强制执行最新 FAPI 2 草案规范。感谢 Takashi Norimatsu 的贡献。

DPoP 预览支持

Keycloak 预览支持 OAuth 2.0 在应用程序层演示证明拥有权 (DPoP)。感谢 Takashi NorimatsuDmitry Telegin 的贡献。

自省端点更多灵活性

在以前版本中,自省端点会自动返回访问令牌中可用的多数声明。现在,大多数协议映射器都包含一个新的 添加到令牌自省 开关。此新增功能提供了更多灵活性,因为自省端点可以返回与访问令牌不同的声明。此更改是实现“轻量级访问令牌”支持的第一步,因为访问令牌可以省略许多声明,而这些声明仍将由自省端点返回。从以前的版本迁移时,自省端点应返回与访问令牌返回的相同的声明,因此,在迁移后,默认情况下,行为应保持有效地相同。感谢 Shigeyuki Kabano 的贡献。

OAuth 2.0 设备授权授予流的特性标志

OAuth 2.0 设备授权授予流现在包含一个特性标志,因此您可以轻松地禁用此功能。此功能默认情况下仍处于启用状态。感谢 Thomas Darimont 的贡献。

身份验证

Passkeys 支持

Keycloak 预览支持 Passkeys.

Passkey 注册和身份验证是通过 WebAuthn 的功能实现的。因此,Keycloak 的用户可以通过现有的 WebAuthn 注册和身份验证来进行 Passkey 注册和身份验证。

同步的 Passkeys 和设备绑定的 Passkeys 都可以用于同一设备和跨设备身份验证。但是,Passkeys 操作成功与否取决于用户的环境。请确保哪些操作可以在 该环境 中成功。感谢 Takashi Norimatsu 的贡献,以及感谢 Thomas Darimont 在这个功能的理念和测试方面提供的帮助。

WebAuthn 改进

WebAuthn 策略包含一个新字段:额外来源。它提供了与非 Web 平台(例如,原生移动应用程序)更好的互操作性。感谢 Charley Wu 的贡献。

您已登录

此版本解决了当用户在一个浏览器选项卡中打开登录页面并在另一个浏览器选项卡中进行身份验证时出现的问题。当用户尝试在另一个浏览器选项卡中进行身份验证时,会出现一条消息:您已登录。现在,这种情况已得到改进,因为在第一个选项卡中进行身份验证后,其他浏览器选项卡会自动对用户进行身份验证。但是,仍然需要进一步改进。例如,当身份验证会话过期并在一个浏览器选项卡中重新启动时,其他浏览器选项卡不会自动遵循登录操作。

用于指定最大身份验证时间的密码策略

Keycloak 支持一项新的密码策略,该策略允许您指定用户在无需重新身份验证的情况下可以更改密码的身份验证的最大时间。当此密码策略设置为 0 时,用户需要重新身份验证才能在帐户控制台或通过其他方式更改密码。您还可以指定低于或高于默认值 5 分钟的值。感谢 Thomas Darimont 的贡献。

部署

对多站点主动-被动部署的预览支持

在某些环境中,将 Keycloak 部署到多个独立的站点对于提供高可用性和快速恢复故障至关重要。此版本添加了对 Keycloak 的主动-被动部署的预览支持。

大量工作都投入到了测试和验证一个可以承受负载并在故障情况下恢复的设置中。要开始使用,请使用 高可用性指南,该指南还包含一个综合蓝图,用于将高可用性 Keycloak 部署到云环境。

适配器

OpenID Connect WildFly 和 JBoss EAP

在以前版本中已弃用的 WildFly 和 JBoss EAP 的 OpenID Connect 适配器已在此版本中删除。它已被 Elytron OIDC 适配器取代,该适配器包含在 WildFly 中,并提供从 Keycloak 适配器进行无缝迁移。

SAML WildFly 和 JBoss EAP

WildFly 和 JBoss EAP 的 SAML 适配器不再作为 ZIP 下载发布,而是作为 Galleon 功能包发布,这使得安装更容易和更无缝。

有关详细信息,请参阅 保护应用程序指南

服务器分发

负载卸载支持

Keycloak 现在具有 http-max-queued-requests 选项,允许在高负载下适当地拒绝传入请求。有关详细信息,请参阅 生产指南

RESTEasy Reactive

Keycloak 已切换到 RESTEasy Reactive。即使不使用响应式样式/语义,使用 quarkus-resteasy-reactive 的应用程序仍应受益于更快的启动时间、运行时性能和内存占用。直接依赖 JAX-RS API 的 SPI 应与此更改兼容。依赖于 RESTEasy Classic(包括 ResteasyClientBuilder)的 SPI 将不兼容,需要更新。此更新对于其他 JAX-RS API 实现(如 Jersey)也将是必需的。

用户资料

声明式用户资料在此版本中仍然是预览功能,但我们正在努力将其提升为受支持的功能。欢迎反馈。如果您发现任何问题或有任何改进的想法,请随时创建 Github 问题,理想情况下应贴上 area/user-profile 标签。建议您还查看 升级指南,其中包含与此版本迁移更改相关的其他信息。

组可扩展性

针对包含许多组和子组的使用场景,对组搜索的性能进行了改进。有一些改进,允许分页查找子组。感谢 Alice 的贡献。

主题

主题的本地化文件默认使用 UTF-8 编码

主题的消息属性文件现在以 UTF-8 编码读取,并自动回退到 ISO-8859-1 编码。

请参阅迁移指南了解详细信息。

存储

删除地图存储

地图存储在以前版本中一直是实验性功能。从本版本开始,它已被删除,用户应继续使用当前的 JPA 存储。请参阅迁移指南了解详细信息。

Keycloak 22.0.3

通过模板注册或更新用户时的安全漏洞

Keycloak 22.0.2 中引入了安全漏洞。我们强烈建议不要升级到 22.0.2,并且对于已在生产环境中部署了 22.0.2 的任何用户,请立即升级到 22.0.3。

对于在将 Keycloak 升级到 22.0.2 后自我注册的用户,他们的密码未安全存储,并且可能暴露给 Keycloak 管理员。这只会影响在升级发布后注册的用户,不会影响以前注册的任何用户。

任何使用预览版声明式用户资料的领域都不会受到此问题的影响,只有使用默认用户资料提供者的领域才会受到影响。

要确定您的部署中是否有任何受影响的用户,您可以通过访问数据库并运行以下 SQL 语句来查询它们

SELECT DISTINCT U.ID, U.USERNAME, U.EMAIL, U.REALM_ID FROM USER_ENTITY U
    INNER JOIN USER_ATTRIBUTE UA ON U.ID = UA.USER_ID
    WHERE UA.NAME IN ('password','password-confirm')

我们建议联系所有受影响的用户,并为他们添加“需要更新密码”操作。

如果存在任何受影响的用户,我们还建议通过运行以下 SQL 语句从数据库中删除这些属性

DELETE FROM USER_ATTRIBUTE UA WHERE UA.NAME IN ('password','password-confirm')

如果在 22.0.2 版本发布后对数据库进行了任何备份,并且存在受影响的用户,我们建议删除这些备份。

自定义用户存储提供者

如果提供者委托给 Keycloak 存储用户属性,任何具有自定义用户存储联合提供者的部署也可能受到影响,请验证您的自定义用户存储以确定这是否是问题。

要确定您的部署中是否有任何受影响的联合用户,您可以通过访问数据库并运行以下 SQL 语句来查询它们

SELECT DISTINCT USER_ID,REALM_ID,STORAGE_PROVIDER_ID FROM FED_USER_ATTRIBUTE
    WHERE NAME IN ('password','password-confirm')

如果存在任何受影响的联合用户,我们还建议通过运行以下 SQL 语句从数据库中删除这些属性

DELETE FROM FED_USER_ATTRIBUTE UA WHERE UA.NAME IN ('password','password-confirm')

如果您的自定义用户存储提供者本身管理属性,则应查看您的自定义存储以删除 passwordpassword-confirm 属性。

Keycloak 22.0.2

LDAP 和 Kerberos 集成方面的改进

Keycloak 现在在一个领域中支持多个 LDAP 提供者,这些提供者支持与同一 Kerberos 领域进行 Kerberos 集成。当 LDAP 提供者无法找到通过 Kerberos/SPNEGO 进行身份验证的用户时,Keycloak 会尝试回退到下一个 LDAP 提供者。Keycloak 还更好地支持单个 LDAP 提供者支持多个彼此信任的 Kerberos 领域的场景。

Keycloak 22.0.0

服务器分发

删除 Java 11 支持

不再支持使用 Java 11 运行 Keycloak 服务器。Java 11 在 Keycloak 21 中已弃用,并宣布计划在 Keycloak 22 中删除。

升级到 Quarkus 3.x

Keycloak 升级到 Quarkus Java 框架的 3.2.0.Final 版本。Quarkus 3.x 延续了推动 Java 开发的传统,以最快的速度前进,并通过最新技术提供尖端的用户体验。

从 Java EE 迁移到 Jakarta EE

作为升级到 Quarkus 3.x 的一部分,Keycloak 将其代码库从 Java EE(企业版)迁移到其继任者 Jakarta EE,这将对 Keycloak 带来各种更改。我们已升级所有 Jakarta EE 规范,以支持 Jakarta EE 10。

不再对 JAX-RS 资源启用上下文和依赖项注入

为了提供更好的运行时性能并尽可能利用底层堆栈,我们移除了所有使用javax.ws.rs.core.Context注解的上下文数据的注入点。预期的性能提升包括在请求生命周期中不再多次创建代理实例,以及大幅减少运行时的反射代码量。

升级到 Hibernate ORM 6

Keycloak 现在得益于升级到 Hibernate ORM 6.2,这带来了性能提升、更优化的 SQL、现代 JDK 支持以及对现代 RDBMS 特性的支持。

Elytron 凭证存储替换

之前已移除的 WildFly 发行版提供了一个内置的 vault 提供程序,它从基于密钥库的 Elytron 凭证存储中读取秘密信息。由于此功能不再可用,我们添加了 Keycloak Vault SPI 的新实现,称为 Keycloak KeyStore Vault。顾名思义,此实现从 Java 密钥库文件读取秘密信息。这些秘密信息随后可以在管理控制台的多个位置使用。有关更多详细信息,请参阅我们的指南和最新的文档.

添加 KeyStore 配置源

与 KeyStore Vault 新闻相关,我们还集成了 Quarkus 最近发布的功能,称为 KeyStore 配置源。这意味着在现有的配置源(CLI 参数、环境变量和文件)中,您现在可以通过存储在 Java 密钥库文件中的配置属性来配置您的 Keycloak 服务器。您可以在配置指南中了解有关此功能的更多信息。

主机名调试工具

由于一些用户在正确配置服务器的主机名方面遇到了问题,因此现在提供了一个新的辅助工具来帮助调试配置。

直通代理模式更改

使用 Keycloak 的--proxy 配置设置且模式为 **直通** 的安装应该查看文档,因为此模式的行为已更改。

导出和导入执行自动构建

在之前的版本中,exportimport 命令需要先运行 build 命令。从本版本开始,exportimport 命令会在构建时配置发生更改时自动重新构建 Keycloak。

管理控制台

帐户控制台 v1 移除

旧的帐户控制台 (v1) 现在已完全移除。此版本的帐户控制台在 Keycloak 12 中被标记为已弃用。

帐户控制台 v3 提升为预览版

在 Keycloak 21.1.0 版本中,新的帐户控制台 (版本 3) 被引入为实验性功能。从本版本开始,它已提升为预览功能。

帐户控制台模板变量移除

暴露给帐户控制台 V2 和 V3 模板的两个变量 (isEventsEnabledisTotpConfigured) 未被使用,并且在本版本中已移除。

如果开发人员扩展了帐户控制台主题,则可能会使用这些变量。因此,如果您正在扩展基本主题,请确保不再使用这些变量。

自定义管理控制台消息的更改

管理控制台(以及很快的新帐户控制台)在解析国际化消息的键方面的工作方式与 Keycloak 的其他部分略有不同。这是因为它使用i18next库进行国际化。因此,在为“领域设置”➡“本地化”下的管理控制台定义自定义消息时,必须考虑 i18next 的最佳实践。具体而言,在为管理控制台定义消息时,在消息键中指定命名空间非常重要。

例如,假设我们要覆盖在创建新领域时向用户显示的welcome消息。此消息位于dashboard命名空间中,与包含消息的原始文件的名称相同 (dashboard.json)。如果我们要覆盖此消息,则必须使用命名空间作为前缀,后跟冒号分隔的消息键,在本例中将变为dashboard:welcome

JavaScript 适配器

移除旧版 Promise API

在本版本中,我们从 Keycloak JS 适配器中移除了旧版 Promise API 方法。这意味着不再可以在适配器返回的 Promise 上调用.success().error()

需要使用new运算符实例化

在之前的版本中,当 Keycloak JS 适配器在没有new运算符的情况下构建时,我们开始积极地记录弃用警告。从本版本开始,这样做将抛出异常。这是为了与JavaScript 类的预期行为保持一致,这将允许将来进一步重构适配器。

管理 API

重命名管理库工件

在升级到 Jakarta EE 之后,Keycloak 管理客户端的工件被重命名为更具描述性的名称,并考虑了长期可维护性。我们仍然提供两个独立的 Keycloak 管理客户端,一个具有 Jakarta EE 支持,另一个具有 Java EE 支持。

支持基于自定义属性的计数用户

用户 API 现在支持基于自定义属性查询用户数量。为此,/{realm}/users/count 端点添加了一个新的q参数。

q参数期望以下格式q=<name>:<value> <name>:<value>。其中<name><value>分别代表属性名称和值。

运算符

k8s.keycloak.org/v2alpha1 更改

keycloak.status 中提供了其他字段来帮助 keycloak 成为可扩展的资源。还有一些其他字段可以使状态更易于解释,例如 observedGeneration 和 condition observedGeneration 以及 lastTransitionTime 字段。

condition 状态字段已从布尔值更改为字符串,以符合标准 Kubernetes 条件。在 CRD 中,它将暂时表示为接受任何内容,但它将始终只是一个字符串。请确保您对该字段的任何使用都更新为期望值 “True”、“False” 或 “Unknown”,而不是 true 或 false。

运算符资源的协同管理

在需要高级管理的情况下,您现在可以直接更新运算符管理的资源上的大多数字段,这些字段尚未由运算符直接设置。这可以用作对不支持的 Keycloak 规范节段的替代方法。与不支持的节段一样,这些直接修改不被视为受支持的。如果您的修改阻止运算符管理资源,Keycloak CR 将显示此错误条件,并且运算符将记录它。

身份代理

OpenID Connect 身份提供程序中的基本声明配置

OpenID Connect 身份提供程序支持一种新的配置,用于指定身份提供程序发出的 ID 令牌必须包含特定声明,否则用户无法通过此代理进行身份验证。

此选项默认情况下处于禁用状态;启用后,您可以指定要过滤的 JWT 令牌声明的名称以及要匹配的值(支持正则表达式格式)。

OpenID Connect 提供程序中对 JWE 加密 ID 令牌和用户信息响应的支持

OpenID Connect 提供程序现在支持Json Web Encryption (JWE),用于 ID 令牌和用户信息响应。提供程序使用为所选加密算法定义的领域密钥来执行解密。

硬编码组映射器

新的硬编码组映射器允许将特定组添加到从身份提供程序代理的用户。

用户会话注释映射器

新的用户会话注释映射器允许将声明映射到用户会话注释。

LDAP 联合

移除 LDAPS 仅信任存储选项

用于 TLS 安全 LDAP 连接的 LDAP 选项(使用信任存储 SPI 仅用于 ldaps)已被移除。此参数用于为 TLS 安全 LDAP 连接选择信任存储:可以选择内部 Keycloak 信任存储 (始终),或选择全局 JVM 信任存储 (从不)。

使用仅用于 ldaps的部署将自动表现得好像始终选项被选中用于 TLS 安全 LDAP 连接。

移除 Openshift 集成功能

允许将 OpenShift 3.x 中的内部 IdP 替换为 Keycloak 的openshift-integration 预览功能已从 Keycloak 代码库中移除到单独的扩展项目中。

Keycloak 21.1.2

验证有效重定向 URI 的方案的更改

如果应用程序客户端使用非 http(s) 自定义方案,从现在起,验证要求有效的重定向模式明确允许该方案。允许custom方案的示例模式为custom:/testcustom:/test/*custom:*。出于安全原因,*之类的通用模式不再涵盖它们。

Keycloak 21.1.0

单体仓库

过去,Keycloak 在多个 GitHub 存储库中维护。

拥有多个存储库带来了很多复杂性和工作量。例如,通常需要向不同的存储库发送多个拉取请求才能进行单个更改。

为了简化流程,我们现在已将所有内容迁移到主存储库中。

FIPS 140-2 支持

Keycloak 中的 FIPS 140-2 支持(在之前的版本中是预览版)现在被提升为正式支持的功能。

实验性帐户控制台版本 3

帐户控制台版本 3 现在在 Keycloak 中以实验性功能的形式提供。此版本支持使用“用户配置文件”功能创建的自定义字段。如果您想试用它并向我们提供一些早期反馈,您可以按如下方式启用它

bin/kc.sh start-dev --features=account3

Keycloak 基于 Java 的适配器中对 Keycloak 授权服务的支持的更改

作为移除已弃用适配器的一部分,Keycloak 策略执行器已从适配器代码库中提取到一个单独的依赖项中

<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-policy-enforcer</artifactId>
    <version>21.1.0</version>
</dependency>

通过提供此依赖项,我们希望能够将策略执行器与您喜欢的 Java 堆栈集成。

它还提供内置支持,使策略执行器能够与使用Wildfly Elytron保护的Jakarta应用程序一起使用。

目前,此依赖项尚未GA,因为我们仍在开发快速入门和文档。

此工作不应影响使用已弃用适配器的现有应用程序。= 默认情况下提供的 Javascript 引擎

在以前版本中,当 Keycloak 在 Java 17 上使用 Javascript 提供程序时,需要将 Nashorn Javascript 引擎添加到发行版中。由于 Keycloak 服务器默认提供 Nashorn Javascript 引擎,因此不再需要这样做。

Keycloak 21.0.0

旧的管理控制台已移除

在 Keycloak 19 中,新的管理控制台已升级为新的默认管理控制台,而旧的管理控制台已被弃用。在此版本中,旧的管理控制台已被完全移除。

Keycloak 使用 Micrometer 进行指标

Keycloak 提供了一个可选的指标端点,该端点以 Prometheus 格式导出指标。在此版本中,提供此数据的实现从 SmallRye 切换到 Micrometer。由于此更改,指标已重命名。

有关详细信息,请参阅迁移指南。

Keycloak 服务器的 Java 11 支持已弃用

现在,使用 Java 11 运行 Keycloak 服务器已被弃用,并计划在 Keycloak 22 中移除。

适配器在 Java 8、Java 11 和 Java 17 上仍然受支持。但是,我们计划在不久的将来移除对 Java 8 的支持。

Hashicop Vault 不再受支持

我们在此版本中移除了对 Hashicorp vault 的开箱即用支持。

有关详细信息,请参阅此讨论

SAML SP 元数据更改

在此版本之前,SAML SP 元数据包含用于签名和加密的相同密钥。从 Keycloak 的此版本开始,我们仅包含用于加密的加密意图领域密钥。对于每个加密密钥描述符,我们还指定了它应该使用的算法。下表显示了支持的 XML-Enc 算法与 Keycloak 领域密钥的映射。有关详细信息,请参阅升级指南

XML-Enc 算法

Keycloak 领域密钥算法

rsa-oaep-mgf1p

RSA-OAEP

rsa-1_5

RSA1_5

用户会话提供程序中的已弃用方法已移除

从用户会话提供程序中移除了一些已弃用的方法。如果尚未完成,则需要使用 Keycloak 20 版本的 Javadoc 中记录的相应替换来替换它们的使用。有关详细信息,请参阅升级指南

新存储:IS_CLIENT_ROLE 可搜索字段已弃用

RoleModel 中的 IS_CLIENT_ROLE 可搜索字段已弃用。它应该替换为与运算符 EXISTSNOT_EXISTS 一起使用的 CLIENT_ID 可搜索字段。有关详细信息,请参阅 Keycloak 21 的 JavaDoc。

FIPS 140-2 预览支持

Keycloak 中的 FIPS 140-2 支持在先前版本中是实验性的,现在已升级为预览版。为了创建此预览版,已经进行了许多修复和改进。有关详细信息,请参阅FIPS 文档。欢迎反馈!

再次感谢David AndersonSudeep DasIsaac Jensen 对此功能的巨大帮助。

在反向代理后面运行时对标准 Forwarded 标头的支持

除了识别非标准 X-Forwarded-* 以获取代理添加的信息(这些信息在代理服务器参与请求路径时会被更改或丢失)外,Keycloak 现在还可以利用标准 Forwarded 标头来实现相同目的。

有关详细信息,请参阅使用反向代理指南。

请确保您的代理在向 Keycloak 节点发出请求时也覆盖 Forwarded 标头。

容器映像现在基于 ubi9-micro

为了增强安全性,Keycloak 容器映像 已以两种方式进行了修改:首先,它现在基于 UBI9,而不是 UBI8。其次,我们已切换到 -micro,而之前使用的是 -minimal

切换到 UBI9 对大多数用户不会产生任何影响。在极少数情况下,可能会出现 glibc 错误CPU 不支持 x86-64-v2x86-64-v2 从 2009 年开始就已经在处理器中提供。当您的虚拟化环境配置错误时,您最有可能遇到此问题。

-minimal 切换到 -micro 有更大的潜在影响。对映像进行简单自定义的用户不会注意到任何区别,但是任何安装 RPM 的用户都需要更改安装方式。在容器中运行 Keycloak指南已更新,以向您展示如何操作。

由于这些更改,已知影响 Keycloak 容器映像的 CVE 减少了 82%!

其他改进

Keycloak 20.0.0

WildFly 发行版已移除

在 Keycloak 17.0.0 中,新的基于 Quarkus 的 Keycloak 发行版问世,而基于 WildFly 的发行版已弃用。在此版本中,WildFly 发行版已被移除,不再受支持。

如果您仍在使用 WildFly 发行版,我们强烈建议您尽快迁移到 Quarkus 发行版,有关详细信息,请参阅迁移指南

新的 Keycloak Operator 升级

我们很高兴地宣布,新的 Keycloak Operator(用于基于 Quarkus 的发行版)不再是预览功能。我们添加了新功能以及一些改进,其中一些导致了重大更改。

领域操作员

由于新的 Operator 目前缺少一些 CR(例如 Client 和 User),因此我们以 Realm Operator 的形式引入了临时解决方法。有关详细信息,请参阅其GitHub 存储库。另请参阅"Keycloak Operator CR 的未来" 博客文章

受支持的 OpenJDK 版本

Keycloak 现在支持 OpenJDK 17,适用于服务器和适配器。

随着基于 WildFly 的发行版的移除,不再支持在 OpenJDK 8 上运行 Keycloak 服务器。我们还计划在 Keycloak 21 中移除对 Keycloak 适配器在 OpenJDK 8 上的支持。

从 Keycloak 22 开始,我们计划只支持最新的 OpenJDK LTS 版本,并争取尽快支持最新的 OpenJDK 版本。这意味着我们将在 Keycloak 22 中移除对 Keycloak 服务器的 OpenJDK 11 支持。

主机名提供程序现在支持配置完整的基 URL

在此版本中,我们引入了两个额外的服务器选项,用于为前端请求和管理控制台设置基 URL。

  • hostname-url

  • hostname-admin-url

更多详细信息可在配置主机名指南中找到。

在 Windows 上运行 Keycloak 时对 kc.bat 的改进

在此版本中,我们对 kc.bat 做出了重要更改,以提供与在 Linux 上运行时相同的体验。

嵌入式 H2 数据库的升级

Keycloak 为开发目的附带了 H2 数据库驱动程序。由于它仅用于开发目的,因此不应在生产环境中使用。

在此版本中,H2 驱动程序已从 1.x 版本升级到 2.x 版本。

用于托管 Keycloak JavaScript 适配器的功能保护

应用程序能够直接从 Keycloak 服务器加载 keycloak.js。由于以这种方式加载 JavaScript 库不被视为最佳实践,因此现在存在一个功能保护,可以禁用此功能。

在 Keycloak 21 中,我们将弃用此选项,并在 Keycloak 22 中计划完全移除从 Keycloak 服务器加载 keycloak.js 的功能。

OTP 应用程序 SPI

在以前的版本中,显示给用户的 OTP 应用程序列表是在 Keycloak 中硬编码的。随着 OTP 应用程序 SPI 的引入,现在可以禁用内置的 OTP 应用程序,以及添加自定义 OTP 应用程序。

自定义身份提供程序现在可以为提供程序设置图标

自定义身份提供程序现在可以设置在登录页面上使用的图标。感谢Klaus Betz,他恰好还维护着一个扩展到 Keycloak 的扩展,以支持使用 AppleID 登录

FIPS 140-2 实验支持

现在对将 Keycloak 部署到 FIPS 140-2 启用的环境中提供了实验支持。将在发布后不久发布一篇博客文章,其中包含有关如何尝试它的详细信息。欢迎反馈!

感谢David Anderson,他为该功能贡献了一些部分。此外,感谢Sudeep DasIsaac Jensen 的初始原型工作,这些工作被用作灵感来源。

按属性搜索组

现在可以通过 Admin REST API 按属性搜索组。感谢Alice 的贡献。

在帐户控制台中查看组成员身份

现在,用户可以在帐户控制台中查看其组成员身份。感谢cgeorgilakis 的贡献。

数据提供程序和模型中的已弃用方法已移除

从数据提供程序和模型中移除了一些已弃用的方法。如果尚未完成,则需要使用 Keycloak 19 版本的 Javadoc 中记录的相应替换来替换它们的使用。有关详细信息,请参阅升级指南

Keycloak 19.0.0

OpenID Connect 和 SAML 适配器的生命周期结束

一些 Keycloak OpenID Connect 适配器已达到生命周期结束,未包含在此版本中。

Fuse 6 和 7 (OpenID Connect)

Keycloak 将不再为 Fuse 6 或 7 提供适配器。如果您需要 Fuse 的适配器,请使用 Red Hat Single Sign-On 7.x 适配器。

JBoss AS 7 和 EAP 6(OpenID Connect 和 SAML)

JBoss AS 7 已经很长时间没有维护了。如果您仍在使用 JBoss AS 7,我们建议您迁移到 WildFly 并利用 WildFly 中的原生 OIDC 支持。

使用 Red Hat JBoss Enterprise Application Platform 6.x 的 Red Hat 客户应使用 Red Hat Single Sign-On 7.x 适配器。这些适配器可以与 Keycloak 服务器结合使用。

Jetty 9.2 和 9.3(OpenID Connect 和 SAML)

Jetty 9.2 于 2018 年达到生命周期结束,而 Jetty 9.3 于 2020 年达到生命周期结束。如果您仍在使用这些版本,我们建议您尽快升级到 Jetty 9.4。

Spring Boot 1(OpenID Connect)

Spring Boot 1.x 于 2019 年达到生命周期结束。如果您仍在使用 Spring Boot 1,我们建议您尽快升级到 Spring Boot 2。

WildFly 传统安全层(OpenID Connect 和 SAML)

在 WildFly 25 中,传统安全层已被删除,将来只支持 Elytron。我们建议任何使用旧版本 WildFly 的人升级并利用 WildFly 中的原生 OIDC 支持。

使用 Red Hat JBoss Enterprise Application Platform 7.x 的 Red Hat 客户应使用 Red Hat Single Sign-On 7.x 适配器。这些适配器可以与 Keycloak 服务器结合使用。

新管理控制台发布

新管理控制台现已发布为默认管理控制台,旧控制台现已弃用。旧控制台将在 Keycloak 21 中删除。

Keycloak 存储中的更改

Keycloak 存储正在发生变化,当前的存储虽然仍然受支持,但最终将被全新的实现所取代。这种变化带来了对云原生存储的更好支持、无停机能力,以及对除用户之外的其他领域实现自定义存储的更好支持。

这意味着当前存储支持的功能中的一些重大更改将成为遗留功能。遗留存储和新存储不能同时使用;一次只能激活一个存储。

最明显的改变是用户存储 SPI 与新的存储 API,即 Map 存储 API 不兼容。因此,用户存储 SPI 将随着遗留存储一起被弃用,并将移至名为 keycloak-model-legacy 的单独模块中。此更改影响多个区域,尤其是与用户联合和自定义用户提供程序相关的区域。

此外,API 已合并,因此存储层的详细信息将对 REST 服务层透明。具体而言,服务将无法区分缓存和非缓存对象,也无法专门访问联合存储与本地存储。

因此,必须审查通过 KeycloakSession 方法访问本地存储或缓存中对象的自定义扩展。有关详细信息,请参阅 升级指南

OIDC 注销更改

在之前的版本中,我们添加了对 OIDC 注销的支持。此版本包含一些其他修复和改进。亮点包括

  • client_id 参数的支持,该参数已在最近的 OIDC RP 发起的注销规范草案中添加。因此,无需使用客户端的 同意要求 标志来显示注销确认屏幕。

  • 在 OIDC 客户端中添加了配置选项 有效注销后重定向 URI。此更改与 OIDC 规范保持一致,允许您使用一组不同的重定向 URI 来在登录和注销后重定向。有效注销后重定向 URI 中使用的值 + 意味着注销将使用与 有效重定向 URI 选项指定的相同一组重定向 URI。此更改还与从先前版本迁移时的默认行为匹配,因为要保持向后兼容性。

有关更多详细信息,请参阅 服务器管理指南

更新电子邮件工作流程

有一个新的预览功能 UPDATE_EMAIL。启用此功能并在领域中启用相应标志后,将要求用户通过单击发送到其新电子邮件地址的链接来确认更新其电子邮件。有关更多详细信息,请参阅 服务器管理指南。感谢 Réda Housni Alaoui 的贡献。

遗留 Keycloak 运算符中已弃用的 podDisruptionBudget

在此版本中,我们已弃用 遗留 Keycloak 运算符 的 Keycloak CR 中的 podDisruptionBudget 字段。当运算符部署在 Kubernetes 版本 1.25 及更高版本上时,将忽略此可选字段。

作为解决方法,您可以在集群中手动创建 Pod Disruption Budget,例如

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  labels:
    app: keycloak
  name: keycloak
spec:
  maxUnavailable: 1
  selector:
    matchLabels:
      component: keycloak

另请参阅 Kubernetes 文档

对集中式日志记录的初步支持

从版本 19 开始,Keycloak 支持使用 GELF 将日志发送到 ELK、EFK 或 Graylog 等集中式日志记录解决方案。这些解决方案开箱即用。

您可以在 日志记录 指南中找到快速启动和运行的文档和示例。

Keycloak 18.0.0

新运算符预览

在此版本中,我们正在引入一个全新的 Keycloak 运算符作为预览版。除了从头开始重写之外,遗留运算符的主要用户界面更改是使用的 Keycloak 发行版——新运算符使用 Quarkus 发行版的 Keycloak。因此,API(以自定义资源定义的形式)已更改。有关详细信息(包括安装和迁移说明),请参阅 与运算符相关的指南

遗留运算符 将继续接收更新,直到 Keycloak 20,届时 Keycloak WildFly 发行版将达到 EOL。

OperatorHub 版本控制方案

为了避免与遗留运算符的版本冲突,新运算符的 18.0.0 版本在 OperatorHub 上发布为版本 20.0.0-alpha.1。遗留运算符的版本控制方案保持不变,即它发布为 18.0.0。

相同的模式将应用于未来的 Keycloak 18 和 19 版本,直到版本 20,届时遗留运算符将达到 EOL。

新管理控制台预览

新管理控制台现已发布为预览版,计划将其在 Keycloak 19 中成为默认管理控制台。

如果您发现新控制台有任何问题,或者对改进有任何建议,请通过 GitHub 讨论 告知我们。

逐步验证

Keycloak 现在支持逐步验证。此功能是在 Keycloak 17 中添加的,并在本版本中进行了进一步的改进。

有关更多详细信息,请参阅 服务器管理指南

感谢 Cornelia LahnsteinerGeorg Romstorfer 的贡献。

客户端密钥轮换

Keycloak 现在通过客户策略支持客户端密钥轮换。此功能现已作为预览功能提供,允许为机密客户端提供领域策略,允许同时使用多达两个密钥。

有关更多详细信息,请参阅 服务器管理指南

恢复代码

恢复代码作为双因素身份验证的另一种方式,现已作为预览功能提供。

OpenID Connect 注销改进

进行了一些修复和改进,以确保 Keycloak 现在完全符合所有 OpenID Connect 注销规范

  • OpenID Connect RP 发起的注销 1.0

  • OpenID Connect 前端注销 1.0

  • OpenID Connect 后端注销 1.0

  • OpenID Connect 会话管理 1.0

有关更多详细信息,请参阅 服务器管理指南

WebAuthn 改进

Keycloak 现在支持 WebAuthn 无标识身份验证。此功能允许 WebAuthn 安全密钥在身份验证期间识别用户,只要安全密钥支持本地密钥即可。有关更多详细信息,请参阅 服务器管理指南。感谢 Joaquim Fellmann 的贡献。

除了此之外,还有更多 WebAuthn 改进和修复。

已弃用的 upload-script 功能已删除

upload-script 功能已被标记为已弃用很长时间。在此版本中,它已完全删除,不再受支持。

如果您正在使用以下任何功能

  • OpenID Connect 脚本映射器

  • 脚本身份验证器(身份验证执行)

  • JavaScript 策略

您应该考虑阅读此 文档 以了解如何仍然依赖这些功能,但将脚本部署到服务器而不是通过管理界面进行管理。

会话限制

Keycloak 现在支持对用户可以拥有的会话数量进行限制。限制可以在领域级别或客户端级别设置。

有关更多详细信息,请参阅 服务器管理指南。感谢 Mauro de Wit 的贡献。

SAML ECP 配置文件默认情况下处于禁用状态

为了减轻滥用 SAML ECP 配置文件的风险,Keycloak 现在阻止所有未明确允许此流程的 SAML 客户端使用此流程。可以使用客户端配置中的 允许 ECP 流程 标志启用配置文件,请参阅 服务器管理指南

Quarkus 发行版

启动时导入领域

Keycloak Quarkus 发行版现在支持在启动时直接导入您的领域。有关更多信息,请查看相应的 指南

JSON 和文件日志记录改进

Keycloak Quarkus 发行版现在最初支持日志记录到文件和使用 JSON 记录结构化数据。

有关改进的更多信息,请查看相应的 日志记录 指南。

对 keycloak.conf 中值的環境變數擴展

Keycloak Quarkus 發行版現在支持從環境變數擴展 keycloak.conf 中的值。

有关更多信息,请查看相应的指南

新选项 db-url-port

您现在可以通过设置新的db-url-port配置选项来显式更改 jdbc 连接字符串的端口。与其他便捷选项一样,如果设置了完整db-url的值,则此选项将被覆盖。

将 metrics-enabled 选项拆分为 health-enabled 和 metrics-enabled

metrics-enabled选项现在只为 Keycloak 启用指标。要启用就绪性和存活探测,有一个新的构建选项health-enabled。这允许更细粒度地使用这些选项。

其他改进

  • 帐户控制台与最新的 PatternFly 版本保持一致。

  • 支持加密的用户资料终结点响应。感谢Giacomo Altiero

  • 支持用于加密密钥的算法 RSA-OAEP with A256GCM。感谢Filipe Bojikian Rissi

  • 支持使用 GitHub 企业服务器登录。感谢Neon Ngo

Keycloak 17.0.0

亮点

Quarkus 发行版现在完全支持

默认的 Keycloak 发行版现在基于 Quarkus。新的发行版更快、更精简,并且配置起来更容易!

我们感谢您从 WildFly 发行版迁移,但这对于每个人来说都不容易,因为您启动和配置 Keycloak 的方式已经彻底改变。考虑到这一点,我们将继续支持 WildFly 发行版,直到 2022 年 6 月。

有关如何迁移到新发行版的详细信息,请查看Quarkus 迁移指南

Quarkus 发行版更新

我们投入了大量精力来完善和改进 Quarkus 发行版,使其尽可能成为最佳体验。一些亮点包括

  • 一种新的文档方法,采用服务器指南的形式,帮助您安装和配置 Keycloak

  • 将 Quarkus 升级到 2.7.0.Final

  • 配置文件不再是特定于 Java 的,并且与 CLI 参数对齐配置键

  • build optionsruntime configuration 之间的清晰区分。

  • h2-memh2-file 数据库重命名为dev-memdev-file

  • 简化启用和禁用功能

  • 自定义和不支持的 Quarkus 配置通过conf/quarkus.properties 完成。

  • 能够通过 JAVA_OPTS_APPEND 添加自定义 Java 选项(感谢dasniko

  • 初始日志记录功能

  • 对跨数据中心 (Cross-DC) 的初始支持

  • 不再支持用户定义的配置文件,而是使用不同的配置文件来实现相同目标

  • 快速入门已更新为使用新发行版

其他改进

离线会话延迟加载

现在,默认情况下,离线会话会从数据库中延迟获取,而不是在服务器启动时预加载。

Keycloak 现在在管理控制台中列出用户时,支持对用户搜索使用类似通配符的语法,这允许三种不同类型的搜索:前缀(foo*,成为默认搜索)、中缀(*foo*)和精确"foo"

Keycloak 16.1.0

亮点

升级到 Wildfly 26.0.0

Keycloak 服务器已升级为使用 Wildfly 26.0.0.Final 作为底层容器。

有关 WildFly 26 的更多信息,请参阅WildFly 26 发行说明

Keycloak 16.0.0

亮点

升级到 Wildfly 25.0.1

Keycloak 服务器已升级为使用 Wildfly 25.0.1.Final 作为底层容器。

WildFly 25 放弃了对传统安全子系统的支持,该子系统完全被 Elytron 替换。这要求对 Keycloak 的配置方式进行重大更改。有关更多详细信息,请参阅迁移指南。

有关 WildFly 25 的更多信息,请参阅WildFly 25 发行说明

升级到 Quarkus 2.5.3

Keycloak.X Quarkus 预览发行版已升级到 Quarkus 2.5.3。

Keycloak 15.1.0

亮点

Quarkus 发行版预览

毫不夸张地说,此版本最大的亮点是对 Quarkus 发行版所做的所有改进。事实上,太多了,很难全部列出来。

CLI 已被彻底改进,我们相信它现在提供了一种非常简单便捷的方法来配置和运行 Keycloak。它几乎简单到不需要文档。

要开始,只需解压缩发行版,然后键入bin/kc.[sh|bat] -h 即可发现精彩!

这并不意味着我们不打算提供配置 Keycloak 的文档,但这次它没有完成。由于缺乏文档,预计在发布后会发布一篇博文,介绍 Quarkus 发行版的所有更改,以及如何使用它的概述。

我们正在快速朝着将 Quarkus 发行版作为我们的默认发行版迈进,并且很快将弃用 WildFly 发行版。考虑到这一点,重要的是尽可能多的人试用它,如果发现任何可用性问题,无法使用它配置某些内容,或者发现任何错误,请向我们提供反馈。

我们很乐意在GitHub 讨论中听到您的想法和意见!

新的管理控制台预览

新的管理控制台的构建非常出色,并且在主发行版中包含了一个预览版。它还没有完全完成所有功能,但仍然有很多东西可以尝试。

WildFly 更新

从 WildFly 23 升级到 WildFly 25 花费的时间比我们预期的要长。我们仍在努力,希望尽快发布带有升级版本的 Keycloak 16,但由于我们希望尽快发布对 Quarkus 发行版的更新,因此我们在此期间发布了此版本。

WildFly 适配器弃用

在 WildFly 25 中,现在有出色的原生 OpenID Connect 支持,无需 Keycloak 适配器。考虑到这一点,我们正在弃用我们的 WildFly 适配器,并且不支持 WildFly 25,但它将继续存在一段时间,用于旧版本的 WildFly 和 Red Hat JBoss Enterprise Application Platform 7.y。

Spring Security 和 Boot 适配器弃用

很久以前,在 Spring Security 5.0 中,Spring 中现在原生支持 OAuth 2.0 和 OpenID Connect。考虑到这一点,现在是开始弃用我们的 Spring Boot 和 Security 适配器的时候了。

OpenID Connect 前端通道注销支持

Keycloak 现在支持OpenID Connect 前端通道注销 1.0

有关更多详细信息,请查看服务器管理指南

感谢Ronaldo Yamada 的贡献。

Keycloak 运算符中的弃用功能

在本版本中,我们已弃用或标记为不支持 Keycloak 运算符中的某些功能。这涉及备份 CRD 和运算符管理的 Postgres 数据库。

Keycloak 15.0.1

亮点

此版本包含一些重要的错误修复。此外,我们要感谢Leandro José de Bortoli 对 FAPI 相关功能的贡献,例如 JARM 支持和 CIBA 的改进。

Keycloak 15.0.0

亮点

金融级 API (FAPI) 改进、FAPI CIBA 和巴西开放银行

Keycloak 服务器改进了对金融级 API (FAPI) 的支持。更具体地说,Keycloak 现在符合 FAPI CIBA 和巴西开放银行的要求。我们还支持 CIBA ping 模式。感谢Takashi Norimatsu,他完成了大部分关于 FAPI CIBA 的工作,并且一直在为 Keycloak 项目做着非常棒的工作。还要感谢Dmytro MishchukAndrii MurashkinHryhorii HevorkianLeandro José de Bortoli,他们也为 FAPI 合规性做了很多工作。最后,感谢FAPI 特别兴趣小组 的所有成员的帮助和反馈。

Keycloak 14.0.0

亮点

客户端策略和金融级 API (FAPI) 支持

Keycloak 服务器现在正式支持客户端策略和金融级 API (FAPI)。此功能在早期版本中已预览,但现在它更加完善,并且有适当的文档。感谢Takashi Norimatsu,他完成了大部分关于此功能的工作。还要感谢Dmytro MishchukAndrii MurashkinHryhorii Hevorkian,他们也为此功能做了很多工作。最后,感谢FAPI 特别兴趣小组 的所有成员的帮助和反馈。

对用户资料 SPI 的改进和对声明式配置的支持

在本版本中,对用户资料 SPI 进行了一些改进,为管理 Keycloak 中用户资料的方式奠定基础。

这些改进之一是对通过管理控制台配置用户资料的支持。有关更多详细信息,请继续访问服务器管理指南

感谢社区和所有参与此工作的个人。

对离线会话的改进

离线会话预加载已得到改进,感谢Peter Flintholm,它应该更快。

作为一个预览功能,离线会话预加载可以跳过,转而使用延迟加载,感谢Thomas Darimont 的努力。此功能必须在服务器配置中显式激活,有关详细信息,请参见服务器管理指南。

其他改进

  • 支持配置活动身份验证会话的最大数量。默认值为每个浏览器会话 300 个身份验证会话(浏览器选项卡)。

Keycloak 13.0.0

亮点

升级到 Wildfly 23

Keycloak 服务器已升级为使用 Wildfly 23.0.2.Final 作为底层容器。

OAuth 2.0 设备授权授予 (RFC 8628)

现在支持 OAuth 2.0 设备授权授予。

感谢 Hiroyuki Wada、Łukasz DywickiMichito Okai

OpenID Connect 客户端发起后台认证 (CIBA)

现在支持 OpenID Connect 客户端发起后台认证 (CIBA)。

感谢 Takashi NorimatsuAndrii MurashkinChristophe Lannoy 和 FAPI 工作组成员的实施和反馈。

SAML Artifact 绑定在服务器到客户端的通信中

Keycloak 现在支持使用 SAML Artifact 绑定的客户端通信。客户端配置中引入了一个新的 Force Artifact Binding 选项,它强制使用 Artifact 消息与客户端通信。有关更多详细信息,请参阅 服务器管理指南。请注意,此版本中的 Keycloak SAML 客户端适配器不支持 Artifact 绑定。

感谢 AlistairDoswaldharture

支持 PKCE 用于身份代理

Keycloak 现在可以在代理到外部 OpenID Connect IdP 时利用 PKCE。

感谢 thomasdarimont

默认角色处理改进

默认角色现在在内部存储为一个新角色的组合角色,通常名为 default-roles-<realmName>。与直接将 realm 和所有客户端默认角色分配给新创建的用户或通过身份代理导入的用户不同,只需将角色分配给他们,其他默认角色将作为有效角色分配。此更改提高了默认角色处理的性能,尤其是对于大量客户端,因为它不再需要遍历所有客户端。

Keycloak 12.0.0

亮点

Keycloak.X 分发预览

介绍新的即将推出的 Keycloak.X 分发的预览版。此分发版由 Quarkus 提供支持,为启动时间和内存消耗带来了显著改进,并使 Keycloak 的配置变得更加容易。

新的帐户控制台现在是默认的

新的帐户控制台不再是预览功能,现在是 Keycloak 中的默认帐户控制台。旧的帐户控制台会保留一段时间。对于那些为旧的帐户控制台定制主题的人,旧的控制台将默认使用,让您有时间将定制主题更新到新的帐户控制台。

OpenID Connect 后台注销

现在支持 OpenID Connect 后台注销,感谢 DaSmoobenjamin37

升级到 Wildfly 21

Keycloak 服务器已升级为使用 Wildfly 21 作为底层容器。

能够在 SAML 身份提供者中请求 AuthnContext

已添加对 SAML 身份提供者发出的身份验证请求中 AuthnContext 部分的规范的支持。

感谢 lscorcia

FAPI RW 支持和对客户端策略的初始支持

已经做了很多工作来支持金融级 API 读取和写入 API 安全配置文件 (FAPI RW)。这可以通过使用客户端策略来实现,并且仍处于预览状态。您可以在接下来的版本中期待更多改进。感谢 Takashi Norimatsu 和所有 FAPI 特别兴趣小组 成员。

将登录主题升级到 PatternFly 4

Keycloak 登录主题组件已升级到 PatternFly 4。旧的 PatternFly 3 与新的 PatternFly 4 同时运行,因此可以将 PF3 组件保留在那里。

登录主题中还有一些设计更改,以提供更好的用户体验。您甚至可以为定制的 Identity Provider 定义图标。有关详细信息,请参阅 文档

Gatekeeper 停产

Gatekeeper 于 21 年 11 月停产。这意味着我们不再支持或更新它。公告可在 此处 查看。

其他改进

  • 支持在没有刷新令牌且没有用户会话的情况下使用 OAuth2 客户端凭据授予。感谢 Thomas Darimont

  • 支持将访问令牌发送到 OAuth2 吊销端点

Keycloak 11.0.0

亮点

LDAPv3 密码修改操作

已添加对 LDAPv3 密码修改操作的支持。管理员控制台中还能够从配置的 LDAP 服务器请求元数据,以查看它是否支持 LDAPv3 密码修改操作。

感谢 cachescrubber

LDAP 组映射器的命名空间支持

LDAP 组映射器的命名空间支持允许您将 LDAP 中的组映射到 Keycloak 组树的指定分支(命名空间)下。以前,LDAP 中的组始终作为 Keycloak 中的顶级组添加。

升级到 WildFly 20

Keycloak 服务器已升级为在幕后使用 WildFly 20.0.1.Final。有关更多详细信息,请查看 升级指南

SAML POST 绑定在最新版本的浏览器中已损坏

JSESSIONID Cookie 的 SameSiteNone 对于 Keycloak SAML 适配器的正确行为是必要的。使用不同的值会导致在使用 SAML POST 绑定时,每次向 Keycloak 发出请求时都会重置容器的会话。请参阅以下步骤 Keycloak SAML Galleon 特性包,用于 WildFly 和 EAP 指南,以保持正确的行为。请注意,此解决方法也应该适用于适配器的先前版本。

其他改进

Keycloak 10.0.0

亮点

身份代理同步模式

使用身份代理同步模式,现在可以控制用户配置文件是在首次登录时更新,还是在每次从外部 Identity Provider 登录时更新。也可以覆盖单个映射器上的此行为。

感谢 Martin Idel

OpenID Connect/OAuth 2.0 的客户端会话超时

通常,SSO 会话会持续数天甚至数月,而单个客户端会话应该理想情况下短得多。通过引入客户端会话超时,现在可以为单个客户端配置单独的超时,以及为 realm 中的所有客户端配置默认超时。

OAuth 2.0 令牌吊销 (RFC 7009)

对于将 Keycloak 用作 OAuth 2.0 授权服务器的应用程序,现在支持通过令牌吊销端点吊销刷新令牌。

安全头 SPI 和响应过滤器

引入了新的 SPI,以在设置响应的安全相关头时提供更好的灵活性。这在 Keycloak 中提供了更简洁的实现,但也允许在需要时进行完全定制。安全头现在由响应过滤器而不是代码本身设置,这使得它不易出错,消除了某些响应缺少头的可能性。

升级到 WildFly 19

Keycloak 服务器已升级为在幕后使用 WildFly 19。

其他改进

  • 向 Keycloak JavaScript 适配器添加了对调用应用程序发起操作的支持

  • 提高了在评估期间获取资源和策略的性能

Keycloak 9.0.1

亮点

从 JavaScript 适配器中删除 PromiseType

已从 JavaScript 适配器中删除 promiseType 初始化选项。相反,返回一个支持原生 Promise API 和旧版 Keycloak Promise API 的 Promise。这允许应用程序从旧版/已弃用的 API 逐渐迁移到原生 Promise API。

其他改进

还原对 LocaleSelectorSPI 的重大 API 更改

在 9.0.0 中,对 LocaleSelectorSPI 引入了重大 API 更改。在 9.0.1 中,现在已还原对该 API 的更改,并引入了新的 LocaleUpdaterSPI。

修复了 Spring Boot 应用程序中 KeycloakConfigResolver 实例的自动解析

在以前的版本中,Spring Boot 应用程序必须手动实现 KeycloakConfigResolver 接口或扩展内置的 org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver

此版本通过在未提供任何实例的情况下自动解析实例来修复向后兼容性问题。以及仍然允许应用程序提供自己的配置解析器实现。

Keycloak 9.0.0

亮点

Drools 策略已删除

在停用期结束后,Drools 策略终于被删除了。如果您需要更复杂的策略,您仍然可以使用基于 JavaScript 的策略。

对客户端的支持分页

管理控制台和 REST API 的客户端添加了分页支持。感谢 saibot94

新的 Elytron 凭据存储库提供程序

一个新的内置库提供程序已作为 WildFly 扩展添加,它从基于密钥库的 Elytron 凭据存储库中读取机密。凭据存储库的创建和管理由 Elytron 使用 elytron 子系统或 elytron-tool.sh 脚本处理。

W3C WebAuthn 和身份验证流程的更多更新

在此版本中,我们对身份验证流程进行了一些可用性改进。对于最终用户而言,在可用的双重身份验证机制之间进行选择应该更加容易。考虑到用户可能拥有多个 OTP 或 WebAuthn 凭据,使用 OTP 或 WebAuthn 登录应该更加直观。此外,对无密码 WebAuthn 身份验证的支持也得到了改进。最后,我们对与身份验证流程相关的缺陷进行了一些修复。

改进的用户区域设置处理

对选择登录页面区域设置以及更新用户区域设置的方式进行了一些改进。

其他改进

  • 在 Gatekeeper 上,仅当授权标头的类型为 Bearer 时才考虑授权标头令牌。感谢 HansK-p

  • 使用签署的客户端密钥 JWT 进行客户端身份验证时,支持更多算法。具体来说,已添加 HS384 和 HS512 算法。感谢 tnorimat

Keycloak 8.0.2

亮点

从 80 版本开始,Google Chrome 将将 SameSite cookie 参数的默认值更改为 Lax。因此,需要对几个 Keycloak cookie 进行更改(尤其是那些在 Javascript 适配器中用于使用 iframe 检查会话状态的 cookie),以将 SameSite 参数设置为 None。请注意,此设置还需要设置 Secure 参数,因此从本版本开始,Javascript 适配器仅在 Keycloak 端使用 SSL/TLS 连接时才能完全正常工作。

Keycloak 8.0.1

亮点

LDAP 问题

此版本修复了 Keycloak 7 中引入的 LDAP 中的一个严重漏洞。如果您在生产环境中使用 Keycloak 7.0.0、7.0.1 或 8.0.0,我们强烈建议您立即升级。

WildFly 18.0.1.Final

升级到 WildFly 18.0.1.Final,其中包含对第三方库中多个 CVE 的更新。

Keycloak 8.0.0

亮点

几个配置字段可以从库中获取其值,而不是直接输入值:LDAP 绑定密码、SMTP 密码和身份提供者机密。

此外,还引入了新的库 SPI,以支持开发扩展以从自定义库访问机密。

新的默认主机名提供程序

固定主机名提供程序和请求主机名提供程序已被单个新的默认主机名提供程序取代。此提供程序具有一些改进,包括

  • 无需更改提供程序即可设置固定基本 URL

  • 支持前端和后端请求的不同基本 URL

  • 支持在 Keycloak 通过反向代理在不同上下文路径上公开的情况下更改上下文路径

主题资源中的消息

主题资源中的消息捆绑包支持对自定义提供程序(如身份验证器)进行国际化。它们还可以在所有主题类型之间共享,例如,可以在登录和帐户控制台之间共享消息。感谢 micedre

SAML 适配器的 RoleMappingsProvider SPI

我们添加了一个新的 SPI,它允许配置自定义角色映射器,SAML 适配器使用这些映射器将从 SAML 断言中提取的角色映射到 SP 应用程序环境中存在的角色。这在适配器需要与第三方 IDP 通信并且 IDP 在断言中设置的角色与为 SP 应用程序定义的角色不匹配时特别有用。要在 keycloak-saml.xml 文件或 keycloak-saml 子系统中配置要使用的提供程序。还提供了一个基于属性文件内容执行角色映射的实现。

请注意,当 Keycloak 充当 IDP 时,我们可以使用内置角色映射器在将角色设置到断言之前执行任何必要的映射,因此在这种情况下,此 SPI 可能冗余。RoleMappingsProvider SPI 是为 IDP 在将角色添加到断言之前没有提供任何方式来映射角色的情况而设计的。

WildFly 18 升级

Keycloak 服务器已升级为在幕后使用 WildFly 18。

W3C Web 身份验证支持

在此版本中,我们添加了对 W3C Web 身份验证 (WebAuthn) 的初始支持。当前实现中有一些限制,但我们正在努力进一步改进这方面。感谢 tnorimat 的贡献。还要感谢 ynojima 的帮助和反馈。

支持无密码身份验证、多因素身份验证和每个用户多个凭据

随着 W3C Web 身份验证支持的到来,我们已经改进了身份验证流程系统,以便允许用户选择首选的登录身份验证方法(例如,在 OTP 凭据和 WebAuthn 凭据之间进行选择)。新机制还允许管理员为无密码登录制作流程,例如只使用 WebAuthn 作为身份验证方法。请注意,在进行这些更改后,您创建的任何自定义身份验证流程可能需要适应新的流程逻辑。

由于这些更改,用户现在可以拥有多个 OTP 设备和多个 WebAuthn 设备。允许用户在登录期间选择使用哪种类型的设备的相同系统也允许用户选择使用哪个特定设备。感谢 Cloudtrust 团队:AlistairDoswaldsispeoFratt 的贡献,以及 hartureLaurent 的帮助。

其他改进

theme.properties 中的系统属性和环境变量支持

现在可以在 theme.properties 文件中使用系统属性和环境变量。感谢 Opa-

支持使用签署的 JWT 进行客户端身份验证的更多签名算法

感谢 tnorimat,我们支持使用签署的 JWT 进行客户端身份验证的更多签名算法。

可配置的 OIDC 身份提供者的客户端身份验证方法

在此版本中,添加了使用签署的 JWT 或基本身份验证对 OIDC 提供程序进行身份验证的可能性。因此,现在支持 OIDC 规范 中提到的所有客户端身份验证方法。感谢 madgaetrradillen 的贡献。

支持启用/禁用对 Javascript 适配器的日志记录

感谢 jonkoops,现在可以为 JS 适配器启用或禁用日志记录。

从 Javascript 适配器中删除了凭据支持

在 Javascript 适配器中提供客户端凭据的选项已删除。感谢 jonkoops

Gatekeeper 的更新

  • Gatekeeper 中包含安全令牌和注销端点。感谢 fredbi

  • Gatekeeper 上存在一个错误,导致 cookie 被应用于子域。感谢 daniel-ac-martin 修复了该问题

  • 现在,Gatekeeper 提供对 Same-site cookie 的支持。感谢 fiji-flo

将脚本部署到服务器

请查看 7.0.1 版本说明,详细了解如何现在可以部署和运行脚本以自定义特定行为。

Keycloak 7.0.1

将脚本部署到服务器

到目前为止,管理员可以通过 Keycloak 管理控制台以及通过 RESTful 管理 API 将脚本上传到服务器。

从现在起,默认情况下此功能被禁用,用户应该优先考虑直接将脚本部署到服务器。有关更多详细信息,请查看 Javascript 提供程序

Keycloak 7.0.0

亮点

WildFly 17 升级

Keycloak 服务器已升级为在幕后使用 WildFly 17。

Tomcat 9 适配器支持

Apache Tomcat 8 和 Apache Tomcat 9 的 Java 适配器已统一,现在它同时支持这两个适配器。

新的帐户控制台

新的帐户控制台和帐户 REST API 已进行了大量工作。它还没有完全准备好,但正在逐步完善,希望在 Keycloak 8 中完全完成。

签名和加密的 ID 令牌支持

Keycloak 可以根据 Json Web 加密 (JWE) 规范支持签名和加密的 ID 令牌。感谢 tnorimat

测试和发布自动化

Keycloak 团队在 Keycloak 和 Red Hat 单点登录的测试和发布自动化方面投入了大量时间。

其他改进

  • PKCE 支持已添加到 Javascript 适配器。感谢 thomasdarimont

  • Oracle 数据库支持已添加到 Keycloak 容器镜像中。感谢 nerdstep

  • 时钟偏差支持已添加到 SAML 适配器中。感谢 steevebtib

  • Node.js 适配器的 TypeScript 支持。感谢 evanshortiss

  • Gatekeeper 现在允许在标头中提供未加密的令牌,同时在 cookie 中加密。在 Keycloak 服务器上启用“撤销刷新令牌”时,Gatekeeper 还存在一个错误。该问题已修复。感谢 fredbi

  • 管理控制台中添加了一个新选项卡,用于显示客户端角色的用户列表。感谢 unly

Keycloak 6.0.0

WildFly 16 升级

Keycloak 服务器已升级为在后台使用 WildFly 16。

SmallRye 健康和指标扩展

Keycloak 现在默认启用 SmallRye 健康和指标扩展,提供标准的健康和指标端点。 我们很快将添加一些文档以及 Keycloak 特定指标。

PS256 支持

感谢 tnorimat,Keycloak 现在支持使用 PS256 签名和验证令牌。

MP-JWT 客户端范围

新的内置客户端范围,可以轻松地根据 Eclipse MicroProfile 规范颁发令牌。

Keycloak 5.0.0

WildFly 15 升级

Keycloak 服务器已升级为在后台使用 WildFly 15。

Keycloak 4.8.0.Final

OpenShift 集成

现在可以使用 Keycloak 完全保护 OpenShift 3.11,包括将服务帐户自动公开为 OAuth 客户端作为 Keycloak 的客户端。

这目前是技术预览功能。

规则/Drools 策略被标记为技术预览功能

到目前为止,Drools 策略默认启用。 但是现在,此策略类型仅作为技术预览功能提供,要使用它,您需要启用预览配置文件或相应的特性。 有关更多详细信息,请查看 授权服务指南

已删除对 DB2 的支持

DB2 支持已弃用一段时间。 在此版本中,我们已删除对 DB2 的所有支持。

Keycloak 4.7.0.Final

增强型“记住我”

引入了为“记住我”会话指定不同的会话空闲和最大超时时间的能力。 这使“记住我”会话可以比普通会话存活更长时间。

对组的支持分页

以前,大量组会导致管理控制台出现问题。 现在通过引入组分页来解决此问题。

提高大量脱机会话的启动时间

过去,如果存在大量脱机会话,启动服务器可能需要很长时间。 现在,此启动时间已大大减少。

Keycloak 4.6.0.Final

升级到 WildFly 14

Keycloak 服务器已升级为在后台使用 WildFly 14。

Keycloak Gatekeeper

Keycloak Gatekeeper 提供了一个安全代理,可用于保护应用程序和服务,而无需适配器。 它可以与您的应用程序一起安装在本地,也可以作为 OpenShift 或 Kubernetes 上的 sidecar 安装。

非常感谢 gambol99 为 Keycloak 贡献了这项工作。

Keycloak 4.5.0.Final

签名 SPI

签名 SPI 使得可以插入其他签名算法。 这使其他签名成为可能,并且还使更改签名生成方式成为可能。 例如,使用它允许使用 HSM 设备来签名令牌。

感谢 tnorimat 为此项工作的贡献了很大一部分。

新的签名算法

与签名 SPI 一道,现在还支持其他签名算法。

Keycloak 现在支持 RS256、RS384、RS512、ES256、ES384、ES512、HS256、HS384 和 HS512。

椭圆曲线数字签名算法 (ES256/384/512) 非常有趣,因为它们提供与 RSA 签名类似的安全属性,但使用明显更少的 CPU。

HMAC (HS256/384/512) 在您不希望应用程序自己验证签名时也非常有用。 由于这些是对称签名,因此只有 Keycloak 才能验证签名,这需要应用程序使用令牌自省端点来验证令牌。

感谢 tnorimat 为此项工作的贡献了很大一部分。

对 OpenID Connect 客户端的更好的受众支持

现在可以为 OpenID Connect 客户端颁发的令牌指定受众。 适配器端还支持受众验证。

次要改进

  • 添加了 LocaleSelector SPI,它允许更改为特定请求解析语言环境的方式。 感谢 knutz3n

  • 添加了一个验证器,以在第一次 IdP 身份验证后自动将身份提供者身份链接到现有帐户。 感谢 slominskir

Keycloak 4.4.0.Final

升级到 WildFly 13

Keycloak 服务器已升级为在后台使用 WildFly 13。 这意味着底层依赖项的更新,以及配置的一些更改。 我们现在还支持 WildFly 13 适配器,并且我们为跨数据中心设置升级了底层的 JDG/Infinispan 服务器版本。 有关更多详细信息,请参阅 升级指南

Node.js 中的授权服务支持

在 Node.js 中拥有授权服务支持,使用 Node.js 适配器进行细粒度集中授权变得非常容易。

次要改进

  • 更新欢迎页面的设计

  • 允许将当前语言环境传递给 OAuth2 IdP。 感谢 knutz3n

  • 支持 Content-Security-Policy-Report-Only 安全标头。 感谢 knutz3n

  • 基于脚本的 SAML 协议映射器。 感谢 AlistairDoswald

Keycloak 4.3.0.Final

主机名 SPI

主机名 SPI 引入了一种更灵活的方式来配置 Keycloak 的主机名。 有两个内置提供程序。 第一个是请求,它使用请求标头来确定主机名。 第二个是固定,它允许配置固定主机名。 后者确保只能使用有效的主机名,并且还允许内部应用程序通过备用 URL 调用 Keycloak。

有关更多详细信息,请参阅 服务器管理指南中的威胁缓解部分。

X509 客户端验证器

新添加的客户端验证器使用 X509 客户端证书和双向 TLS 来保护来自客户端的连接。 除此之外,Keycloak 服务器还验证客户端证书的主题 DN 字段。

授权服务的性能改进

对于此版本,我们改进了整个策略评估性能,提高了可靠性和吞吐量。 我们所做的主要更改与尝试通过避免不必要的流程并尽快收集决策来优化策略评估路径有关。 我们还在每个请求的基础上引入了策略决策缓存,避免了先前评估的策略的冗余决策。

我们还在研究其他缓存层,这将提供更好的体验。 请参阅 KEYCLOAK-7952

从服务器获取权限时选择响应模式

在以前的版本中,权限始终使用标准 OAuth2 响应从服务器返回,其中包含访问令牌和刷新令牌。 在此版本中,客户端可以使用 response_mode 参数来指定服务器应如何响应授权请求。 此参数接受两个值

  • 决策

    表示响应应该只包含一个标志,指示服务器是否授予了权限。 否则将返回 403 HTTP 状态代码。

  • 权限

    表示响应应使用 JSON 格式包含服务器授予的每个权限。

NodeJS 策略执行器

keycloak-nodejs-connect(NodeJS 的适配器)现在支持根据从服务器获取的决策来保护资源的构造。 新的构造允许用户使用细粒度的权限来保护其资源,如下所示

app.get('/protected/resource', keycloak.enforcer('resource:view'), function (req, res) {
  res.json({message: 'access granted'});
});

支持 Google 登录的托管域

使用 Google 登录现在支持 hd 参数,以将 Google 登录限制为 Google 的特定托管域。 当在身份提供者中指定此参数时,来自不同域的任何登录都将被拒绝。

感谢 brushmate 的贡献。

在 HTML 输出中转义不安全的标签

大多数 HTML 输出已针对 HTML 标签进行了转义,但有一些地方允许使用 HTML 标签。 这些只是需要管理员访问权限才能更新值的地方。 即使更新此类字段需要管理员访问权限,我们也添加了一层额外的防御,现在正在转义不安全的元素,例如 <script>

Keycloak 4.2.0.Final

对 Cordova 的浏览器选项卡支持

我们现在支持在 Cordova 的 JavaScript 适配器中使用浏览器选项卡和通用链接。 这使多个应用程序之间的 SSO 成为可能,并且提高了安全性。

感谢 gtudan 的贡献。

SAML 适配器多租户支持

SAML 适配器现在可以支持多租户,就像 OpenID Connect 的内置适配器一样。

在其中创建包含点 (.) 的声明的选项

在以前的版本中,无法使用包含点 (.) 字符的声明名称在令牌中创建声明。 现在可以在配置中转义点字符,因此可以使用包含点字符的声明名称。

Keycloak 4.1.0.Final

使 Spring Boot 2 成为默认启动器

从 4.1 版本开始,Spring Boot 启动器将基于 Spring Boot 2 适配器。 如果您使用的是旧版本的 Spring Boot,则可以使用 keycloak-legacy-spring-boot-starter。

Keycloak 4.0.0.Final

客户端范围和对 OAuth 2 范围参数的支持

我们添加了对客户端范围的支持,它取代了客户端模板。 客户端范围是一种更灵活的方法,并且还提供了对 OAuth scope 参数的更好支持。

同意屏幕中与客户端范围相关的更改。 同意屏幕上的列表现在链接到客户端范围,而不是协议映射器和角色。

有关更多详细信息,请参阅文档和迁移指南。

OAuth 2 证书绑定访问令牌

我们现在已经部分实现了 OAuth 2.0 互信 TLS 客户端认证和证书绑定访问令牌 规范。更准确地说,我们支持证书绑定访问令牌。如果您的机密客户端能够使用双向 SSL,Keycloak 将能够将客户端证书的哈希值添加到为客户端发行的令牌中。目前,只有 Keycloak 本身会验证令牌哈希值(例如在 refresh token 请求期间)。我们计划为适配器添加支持。我们还计划添加对互信 TLS 客户端认证的支持。

感谢 tnorimat 的贡献。

授权服务

UMA 2.0 支持

授权服务现在支持 UMA 2.0。如果您是从 Keycloak 的早期版本迁移而来,请查看文档以获取更多详细信息。

通过 Keycloak 帐户服务进行用户管理的访问

现在,最终用户可以通过 Keycloak 帐户服务来管理其资源及其关联的权限。从那里,资源所有者现在可以查看其资源,与其他用户共享资源以及批准来自其他用户的请求。

异步授权流程

在使用 UMA 时,客户端应用程序现在可以选择是否启动授权流程来请求资源所有者的批准。此功能允许应用程序在代表其他用户尝试访问其资源之一时请求资源所有者的批准。

用户管理的权限 API

资源服务器现在能够将其他策略与特定用户拥有的资源相关联。新的 API 提供了使用不同策略类型(例如角色、组、用户、客户端或使用 JavaScript 的条件)来管理这些权限的操作。

推送声明

客户端应用程序现在能够将任意声明发送到 Keycloak 以及授权请求,以便根据这些声明评估权限。当应在特定事务范围内授予(或拒绝)访问权限或基于运行时信息时,这是一个非常方便的补充。

资源属性

现在可以将属性与 Keycloak 保护的资源相关联,并使用这些相同的属性从您的策略评估权限。

策略执行器现在接受常规访问令牌

在某些情况下,您可能只想将常规访问令牌发送到资源服务器,但仍然能够对这些资源执行策略。

此版本引入的主要更改之一是,您不再需要将访问令牌与 RPT 交换才能访问受资源服务器保护的资源(未使用 UMA 时)。根据在资源服务器端如何配置策略执行器,您只需将常规访问令牌作为承载令牌发送,权限仍将被执行。

策略执行器现在可以按需从服务器加载资源

到目前为止,在部署配置了 policy-enforcer 的应用程序时,策略执行器要么从服务器加载所有受保护的路径,要么只是将这些路径从适配器配置中映射出来。用户现在可以选择按需从服务器加载路径,并避免在适配器配置中映射这些资源。根据您拥有的受保护资源数量,此功能还可以缩短部署应用程序所需的时间。

策略执行器现在支持配置资源缓存

为了避免不必要地访问服务器,策略执行器会缓存受保护资源与其在应用程序中对应路径之间的映射。用户现在可以配置缓存的行为,甚至完全禁用它。

声明信息点

适配器上的 policy-enforcer 定义(keycloak.json)也已更新,以支持推送声明的概念。您可以在那里找到 claim-information-point 的概念,它可以设置为从不同的来源推送声明,例如 HTTP 请求,甚至可以从外部 HTTP 服务推送声明。

对评估 API 的改进

用于在 Keycloak 中实现策略(尤其是 JavaScript 和 Drools 策略)的评估 API 现在提供了以下方法:

  • 访问当前领域的的信息,例如检查用户角色、组和属性

  • 将任意声明推送到资源服务器,以提供有关如何执行特定权限的附加信息

授权服务

UMA 2.0

授权服务现在支持 UMA 2.0,包括支持用户通过帐户管理控制台管理用户访问。授权服务还有其他补充和改进。

推送声明

客户端现在可以推送额外的声明,并在评估权限时由策略使用这些声明。

资源属性

现在可以在资源上定义属性,以便在评估权限时由策略使用这些属性。

主题和主题资源

现在可以通过常规提供程序部署将主题热部署到 Keycloak。我们还添加了对主题资源的支持,这允许添加额外的模板和资源,而无需创建主题。这对需要将其他页面添加到身份验证流程的自定义身份验证器很有用。

我们还添加了对覆盖特定客户端的主题的支持。如果这不足以满足您的需求,那么还有一种新的主题选择器 SPI,允许您实现自定义逻辑来选择主题。

Instagram 身份提供者

我们添加了对使用 Instagram 登录的支持。感谢 hguerrero 的贡献。

在管理控制台中按用户 ID 搜索

以前,要在管理控制台中按 ID 搜索用户,您必须编辑 URL。现在可以直接在用户搜索字段中搜索。

适配器

Spring Boot 2

我们现在支持 Spring Boot 2。

Fuse 7

我们现在支持 Fuse 7。

JavaScript - 原生 Promise 支持

JavaScript 适配器现在支持原生 Promise。它还保留对旧式 Promise 的支持。两者可以互换使用。

JavaScript - Cordova 选项

现在可以在 JavaScript 适配器中将 Cordova 特定选项传递给登录和其他方法。感谢 loorent 的贡献。