我需要将 keycloak 与现有应用程序集成。用户使用用户名和密码登录。不幸的是,该应用程序支持区分大小写的用户名,并且必须继续这样做。
创建自定义用户存储提供程序时,在入口点public UserModel getUserByUsername(String username, RealmModel realm)
我获取用户名,但它已经转换为不区分大小写的字符串。
这是一个说明这种情况的例子。
用户名输入 | 收到用户名 | 数据库中的用户 |
---|---|---|
约翰·多伊 | 约翰·多伊 | 约翰·多伊, 约翰·多伊 |
我知道 keycloak 不支持区分大小写的用户,但是为了从数据库中检索用户,我需要能够区分用户。是否可以访问用户名的原始输入?
正如您所注意到的,用户名(以及电子邮件)在 Keycloak 中被转换为小写。此行为是由UserCacheSession
-class 引入的。我发现解决这个问题的唯一方法是在 Keycloak 实例中全局禁用用户缓存。这可以通过在 或standalone.xml
中设置适当的配置值来完成(取决于您的设置,如此处所述)。standalone-ha.xml
domain.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)
删除适当的块以禁用用户缓存。在文档中阅读有关如何配置缓存的更多信息。
归档时间: |
|
查看次数: |
6112 次 |
最近记录: |