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

lio*_*lio 6 java keycloak

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

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

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

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

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

Rob*_*dey 8

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

配置块应该从

<spi name="userCache">
    <provider name="default" enabled="true"/>
</spi>
Run Code Online (Sandbox Code Playgroud)

<spi name="userCache">
    <provider name="default" enabled="false"/>
</spi>
Run Code Online (Sandbox Code Playgroud)

您还可以使用 JBoss CLI 来执行此操作。如果您使用基于 docker 的设置,则可能如下所示。

Dockerfile:

FROM jboss/keycloak:latest
USER root
COPY disable-usercache.cli /opt/jboss/startup-scripts/disable-usercache.cli
USER 1000
Run Code Online (Sandbox Code Playgroud)

disable-usercache.cli:

FROM jboss/keycloak:latest
USER root
COPY disable-usercache.cli /opt/jboss/startup-scripts/disable-usercache.cli
USER 1000
Run Code Online (Sandbox Code Playgroud)

如果您需要更多样品,可以查看此处

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

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

编辑 03/2022:由于 Keycloak 17现在由 Quarkus 提供支持,因此提到的 WildFly 脚本disable-usercache.cli将不再起作用。在 2022 年 6 月之前,您可以使用 Keycloak 17 的旧版 WildFly 支持的发行版,或者查看迁移指南以了解如何迁移到 Quarkus。

编辑 11/2022:对于 Quarkus 支持的 Keycloak 实例,您必须找到文件conf/cache-ispn.xml. 默认配置包含一个用于缓存用户的块,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

删除适当的块以禁用用户缓存。在文档中阅读有关如何配置缓存的更多信息。