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

2024-04-13

我需要将 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 https://github.com/keycloak/keycloak/blob/bfce612641a70e106b20b136431f0e4046b5c37f/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/UserCacheSession.java#L243-班级。我发现解决这个问题的唯一方法是在 Keycloak 实例中全局禁用用户缓存。这可以通过在内部设置适当的配置值来完成standalone.xml, standalone-ha.xml or domain.xml(取决于您所描述的设置here https://wjw465150.gitbooks.io/keycloak-documentation/content/server_installation/topics/cache/disable.html).

配置块应该从

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

to

<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 https://access.redhat.com/documentation/en-us/red_hat_single_sign-on/7.2/html/server_installation_and_configuration_guide/manage_subsystem_configuration.

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

请注意:当然,如果您关闭用户缓存,您会损失一些性能,因为每次必须查找用户时,Keycloak 都会查询用户存储。因此,可能值得实现您自己的区分大小写的用户缓存并覆盖默认缓存更新userCache SPI https://github.com/keycloak/keycloak/blob/3ebfc91b75c3ca6c48bd54380fe4ffe891829aad/docs/updating-server-config.md#updating-an-spi在您的服务器配置文件中。

编辑 03/2022:从 Keycloak 17 开始现在由 Quarkus 提供支持 https://www.keycloak.org/docs/latest/release_notes/index.html#keycloak-17-0-0,提到的WildFly脚本disable-usercache.cli将不再工作了。在 2022 年 6 月之前,您可以使用 Keycloak 17 的旧版 WildFly 支持的发行版,或者查看迁移指南 https://www.keycloak.org/migration/migrating-to-quarkus了解如何迁移到 Quarkus。

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

<infinispan
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="urn:infinispan:config:11.0 http://www.infinispan.org/schemas/infinispan-config-11.0.xsd"
        xmlns="urn:infinispan:config:11.0">
    <cache-container name="keycloak">
        <!-- DELETE THIS BLOCK -->
        <local-cache name="users">
            <encoding>
                <key media-type="application/x-java-object"/>
                <value media-type="application/x-java-object"/>
            </encoding>
            <memory max-count="10000"/>
        </local-cache>
        <!-- UNTIL HERE -->
    </cache-container>
</infinispan>

删除适当的块以禁用用户缓存。阅读有关如何配置缓存的更多信息docs https://www.keycloak.org/server/caching.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐