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

How to access the original case sensitive username input in custom user storage provider of keycloak?

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

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

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

username input received username users in database
John Doe john doe john doe, John Doe

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

正如您注意到的那样,用户名(以及电子邮件)在 Keycloak 中被转换为小写。此行为由 UserCacheSession-class. The only way i found to get around this is to disable user caching globally in the Keycloak instance. This can be done by setting the appropriate configuration values inside standalone.xml, standalone-ha.xml or domain.xml (depending on your setup like described 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, the mentioned WildFly script disable-usercache.cli won't work anymore. Until June 2022 you could use the legacy WildFly powered distribution of Keycloak 17 or have a look at the migration guide 以查看如何迁移到 Quarkus。