正如您所注意到的,用户名(以及电子邮件)在 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.