Keycloak 24.0.0 发布

2024 年 3 月 4 日

要下载此版本,请访问 Keycloak 下载

亮点

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

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

在过去的几个月中,Keycloak 团队花费了大量精力来完善用户配置文件功能,使其得到完全支持。在此版本中,我们继续努力。根据我们优秀社区的全面测试和反馈,进行了大量的改进、修复和完善。

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

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

  • 能够指定哪些用户属性由常规用户或管理员管理并应在表单上显示。

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

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

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

  • 渐进式配置 - 能够指定某些字段是必需的,或者仅对于 scope 参数的特定值在表单上可用。这有效地允许渐进式配置。您不再需要在注册期间要求用户填写 20 个属性;您可以根据用户使用的各个客户端应用程序的要求,逐步要求用户填写属性。

  • 从以前版本迁移 - 用户配置文件现在始终启用,但对于那些未使用此功能的用户,其操作方式与以前相同。您可以从用户配置文件功能中受益,但不是必须使用它们。有关迁移说明,请参阅升级指南

作为受支持功能的用户配置文件的首次发布只是起点,也是交付更多身份管理功能的基础。

我们要非常感谢优秀的 Keycloak 社区,许多想法、需求和贡献都来自社区!特别感谢

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

用户配置文件 SPI 的重大更改

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

Freemarker 模板的更改,用于基于用户配置文件和 Realm 呈现页面

在此版本中,更新了以下模板,以便可以基于为 Realm 设置的用户配置文件配置动态呈现属性

  • login-update-profile.ftl

  • register.ftl

  • update-email.ftl

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

用于在首次通过 Broker 登录时更新配置文件页面的新 Freemarker 模板

在此版本中,当用户首次通过 Broker 进行身份验证时,服务器会使用 idp-review-user-profile.ftl 模板呈现更新配置文件页面。

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

Java 适配器弃用和移除

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

考虑到这一点,这将是包含 OpenID Connect 和 SAML 适配器的 Keycloak 的最后一个主要版本。由于 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 版,该版本将在后续版本中移除。

这个新版本内置了对用户配置文件功能的支持,该功能允许管理员配置哪些属性在账户控制台中对用户可用,并在用户登录后直接将用户定向到他们的个人账户页面。

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

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 添加到您的 Realm 来坚持旧的行为。有关更多详细信息,请参阅升级指南

轻量级访问令牌支持

此版本包含对轻量级访问令牌的支持。因此,您可以为指定的客户端拥有更小的访问令牌。这些令牌只有少量声明,这就是它们更小的原因。请注意,轻量级访问令牌仍然是默认情况下由 Realm 密钥签名的 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 Realm 密钥,并将它们用作各种客户端的签名算法。例如,您可以使用这些密钥来签署令牌或用于使用签名 JWT 进行客户端身份验证。此功能包括身份代理,其中 Keycloak 本身会签署用于第三方身份提供商的 private_key_jwt 身份验证的客户端断言。感谢 Takashi NorimatsuMuhammad Zakwan Bin Mohd Zahid 的贡献。

JavaKeystore 提供程序支持 EC 密钥

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

在使用 private_key_jwt 身份验证进行身份提供程序身份验证时,可以选择将 X509 指纹添加到 JWT

OIDC 身份提供程序现在具有将 X.509 标头添加到 JWT 选项,用于在使用私钥签名的 JWT 进行客户端身份验证的情况。当与某些身份提供程序(如 Azure AD)互操作时,此选项可能很有用,这些身份提供程序要求 JWT 上存在指纹。感谢 MT 的贡献。

OAuth Grant Type SPI

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

CORS 改进

CORS 相关的 Keycloak 功能已提取到 SPI 中,这可以允许更大的灵活性。请注意,CorsSPI 是内部的,并且在未来的版本中可能会发生变化。感谢 Dmitry Telegin 的贡献。

Truststore 改进

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

版本化功能

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

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

Keycloak CR Truststore

您还可以通过使用 Keycloak CR 来利用新的服务器端 Truststore 处理,例如

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 选项现已弃用,将在未来的版本中移除。有关迁移说明,请参阅升级指南

Admin API 和账户上下文中用户表示的更改

在此版本中,我们正在封装根用户属性(例如 usernameemailfirstNamelastNamelocale),方法是将它们移动到基类/抽象类中,以便在使用 Admin 和账户 REST API 时对这些属性的编组和解组方式进行对齐。

此策略提供了客户端管理属性时的一致性,并确保它们符合为 Realm 设置的用户配置文件配置。

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

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

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

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

不再可能代表另一个已通过身份验证的用户执行操作

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

电子邮件验证流程的更改

在此版本中,如果用户尝试点击链接验证电子邮件,但该电子邮件之前已验证,则会显示正确的消息。

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

已弃用离线会话预加载

Keycloak 的默认行为是按需加载离线会话。在启动时预加载它们的旧行为现已弃用,因为在启动时预加载它们无法随着会话数量的增长而很好地扩展,并且会增加 Keycloak 的内存使用量。旧的行为将在未来的版本中移除。

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

内存中离线会话生命周期覆盖的配置选项

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

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

Infinispan 指标使用标签来标记缓存管理器和缓存名称

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

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

用户属性值长度扩展

从此版本开始,Keycloak 支持存储和搜索长度超过 255 个字符的用户属性值,这在以前是一个限制。

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

暴力破解保护更改

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

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

  2. 在以前版本的 Keycloak 中,管理员必须选择暂时或永久禁用用户,原因是针对其帐户的暴力破解攻击。管理员现在可以在给定次数的临时锁定后永久禁用用户。

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

授权策略

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

Keycloak CR cache-config-file 选项

Keycloak CR 现在允许使用 cache 规范 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 Import CR 为 Realm 导入 Job 独立请求和限制资源的能力。

当未指定任何值时,默认 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 的配置选项。

SAML 用户属性映射器对于 NameID 现在仅建议有效的 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 不支持接收带有这些 NameIDPolicy 之一的 AuthnRequest 文档,因此永远不会使用这些映射器。支持的选项已更新为仅包括以下 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

有关更多详细信息,请参阅在容器中运行 Keycloak 指南。

GELF 日志处理程序已被弃用

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

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

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

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

升级

在升级之前,请参阅迁移指南,以获取完整的更改列表。

所有已解决的问题

新功能

增强功能

Bug 修复