Keycloak SPNEGO自动登录报错:重复插入已存在LDAP用户
问题
在Keycloak(26.3.2版本)中配置SPNEGO自动登录时,遇到用户重复插入错误:Keycloak尝试插入已从LDAP导入到数据库的用户drogba,报错信息如下:
KC-SERVICES0013: Failed authentication: org.keycloak.models.ModelDuplicateException: Duplicate resource error Caused by: org.h2.jdbc.JdbcBatchUpdateException: Unique index or primary key violation: "PUBLIC.UK_RU8TT6T700S9V50BU18WS5HA6_INDEX_B ON PUBLIC.USER_ENTITY(REALM_ID NULLS FIRST, USERNAME NULLS FIRST) VALUES ( /* key:14 */ '0ac32dd4-e24c-4eaf-844e-b0c50b378a0e', 'drogba')"; SQL statement: insert into USER_ENTITY (CREATED_TIMESTAMP,EMAIL,EMAIL_CONSTRAINT,EMAIL_VERIFIED,ENABLED,FEDERATION_LINK,FIRST_NAME,LAST_NAME,NOT_BEFORE,REALM_ID,SERVICE_ACCOUNT_CLIENT_LINK,USERNAME,ID) values (?,?,?,?,?,?,?,?,?,?,?,?,?)
当前配置:
- 使用Keycloak 26.3.2版本
- 用户
drogba已从LDAP导入并存在于Keycloak中 - 已启用Kerberos/SPNEGO自动登录
已尝试的操作:
- 设置
syncRegistrations=false - 设置
editMode=READ_ONLY - 设置LDAP导入模式为
READ_ONLY
需求:配置Keycloak,让SPNEGO/Kerberos登录已存在的LDAP用户时不再尝试插入该用户,或提供其他解决方案。
解决方案
1. 校验用户名匹配规则
确保Kerberos认证返回的用户名(如Kerberos主体中的用户名部分)与Keycloak中已导入的LDAP用户username字段完全一致,包括大小写。若Kerberos返回DROGBA而Keycloak中是drogba,会触发重复插入逻辑。
2. 配置SPNEGO的用户查找源
在Keycloak控制台对应Realm中,进入Authentication > Flows,找到SPNEGO所在的认证流(如Browser流):
- 展开
SPNEGO执行步骤,点击「配置」 - 在
User Lookup Provider选项中,选择你的LDAP用户存储(而非默认的keycloak) - 保存后,SPNEGO会直接通过LDAP查找用户,不再尝试创建新用户
3. 确认用户的Federation Link关联
检查已导入用户drogba的Federation Link字段,确保其正确指向你的LDAP用户存储:
- 进入Users > 查看drogba用户 > 属性,确认
Federation Link值为你的LDAP存储名称 - 若该字段为空,Keycloak会将其识别为本地用户,SPNEGO认证时可能触发重复创建
4. 调整Kerberos的主体属性配置
若Kerberos主体格式为user@DOMAIN.COM,需在LDAP存储的Kerberos配置中匹配对应属性:
- 进入User Federation > 你的LDAP存储 > Kerberos标签
- 设置
Principal Attribute为LDAP中存储用户Kerberos主体的属性(如userPrincipalName) - 开启
Use Kerberos For Authentication选项
5. 清理无效本地用户记录
若之前手动创建过同名本地用户,需删除该记录,确保Keycloak中仅存在LDAP导入的用户:
- 进入Users,搜索
drogba,删除所有非LDAP来源的用户记录
内容的提问来源于stack exchange,提问作者Edu Arif
相关产品推荐
相关产品推荐

