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

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

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

在此版本中,服务器使用 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,版本 2 将在后续版本中删除。

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

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

Keycloak JS

package.json 中使用 exports 字段

Keycloak JS 适配器现在在其 package.json 中使用 exports 字段。此更改改进了对更现代的捆绑器(如 Webpack 5 和 Vite)的支持,但也带来了一些不可避免的重大更改。有关更多详细信息,请参见 升级指南

PKCE 默认启用

Keycloak JS 适配器现在默认将 pkceMethod 选项设置为 S256。此更改为使用该适配器的所有应用程序启用了证明密钥代码交换 (PKCE)。如果您在不支持 PKCE 的系统上使用该适配器,可以将 pkceMethod 选项设置为 false 以禁用它。

对密码散列的更改

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

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

轻量级访问令牌支持

此版本包含对轻量级访问令牌的支持。因此,您可以为指定的客户端拥有更小的访问令牌。这些令牌只有几个声明,因此它们更小。请注意,轻量级访问令牌仍然是默认情况下由 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的贡献。

使用私钥 JWT 身份验证进行身份提供程序时,将 X509 指纹添加到 JWT 的选项

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

OAuth 授权类型 SPI

Keycloak 代码库包含一个内部更新,以引入 OAuth 授权类型 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 实体元数据描述符端点自动下载签名证书。为了使用新功能,请在提供程序中配置元数据描述符 URL选项(发布证书的 IDP 元数据信息的 URL)并将使用元数据描述符 URL设置为ON。证书会自动从该 URL 下载并缓存到public-key-storageSPI 中。还可以使用提供程序页面中的操作组合从管理控制台重新加载或导入证书。

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

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

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

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

Keycloak CR 优化字段

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

增强的反向代理设置

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

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

在此版本中,我们将根用户属性(如usernameemailfirstNamelastNamelocale)封装起来,并将它们移至一个基本/抽象类中,以协调在使用管理和帐户 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 导入作业独立请求和限制资源的能力。

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

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

GELF 日志处理程序已弃用

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

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

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

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

升级

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

所有已解决的问题

新功能

增强功能

Bug