如何在keycloak的自定义用户存储提供程序中访问原始区分大小写的用户名输入?

我需要将 keycloak 与现有应用程序集成。用户使用用户名和密码登录。不幸的是,该应用程序支持区分大小写的用户名,并且必须继续这样做。

创建自定义用户存储提供程序时,在入口点 public UserModel getUserByUsername(String username, RealmModel realm) 我得到了用户名,但它已经转换为不区分大小写的字符串。

这是一个说明这种情况的例子。

用户名输入 收到用户名 数据库中的用户
约翰·多伊 约翰·多伊 约翰·多伊,约翰·多伊

我知道 keycloak 不支持区分大小写的用户,但是为了从数据库中检索用户,我需要能够区分用户。是否可以访问用户名的原始输入?

stack overflow How to access the original case sensitive username input in custom user storage provider of keycloak?
原文答案
author avatar

接受的答案

正如您正确注意到的那样,用户名(以及电子邮件)在 Keycloak 中被转换为小写。这种行为是由 UserCacheSession 类引入的。我发现解决此问题的唯一方法是在 Keycloak 实例中全局禁用用户缓存。这可以通过在 standalone.xmlstandalone-ha.xmldomain.xml 中设置适当的配置值来完成(取决于您的设置,如描述的 here )。

配置块应该从

<spi name="userCache">
    <provider name="default" enabled="true"/>
</spi>

<spi name="userCache">
    <provider name="default" enabled="false"/>
</spi>

您也可以为此使用 JBoss CLI。如果您使用的是基于 docker 的设置,则可能如下所示。

Dockerfile

FROM jboss/keycloak:latest
USER root
COPY disable-usercache.cli /opt/jboss/startup-scripts/disable-usercache.cli
USER 1000

disable-usercache.cli

embed-server --server-config=standalone-ha.xml --std-out=echo
batch

/subsystem=keycloak-server/spi=userCache/provider=default/:write-attribute(name=enabled,value=false)

run-batch
stop-embedded-server

如果您需要更多示例,可以查看 here

如果您禁用了用户缓存,则 username 变量应按照用户指定的方式传递。

请注意: 当然,如果您打开用户缓存,您会损失一些性能,因为每次必须查找用户时,Keycloak 都会查询用户存储。因此,可能值得实现您自己的区分大小写的用户缓存,并在您的服务器配置文件中用 updating the userCache SPI 覆盖默认的用户缓存。

编辑 03/2022: 自 Keycloak 17 is now powered by Quarkus 起,提到的 WildFly 脚本 disable-usercache.cli 将不再工作。在 2022 年 6 月之前,您可以使用由 WildFly 驱动的旧版 Keycloak 17,或者查看 migration guide 以了解如何迁移到 Quarkus。


答案: