LDAP连接异常时Keycloak无法更新/查询本地用户配置
Keycloak LDAP连接异常导致本地Realm用户操作失效问题
我已将Keycloak与应用集成并添加LDAP连接,连接正常时功能符合预期。但当LDAP连接出现异常时,即使是本地Realm用户,其配置更新、用户查询操作也会失败。
场景1:本地用户登录补全必填项报错(版本25.0.2、25.0.6)
在25.0.2、25.0.6版本中,创建仅含用户名和密码的“test”用户,登录时被重定向至必填项补充页面,输入邮箱、姓名后报错,日志如下:
2024-09-30 06:58:13,617 ERROR [org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager] (executor-thread-7) Could not query server using DN [ou=myldap,o=test.com] and filter [(&(|(dept=00E640)(dept=B2C))(mail=test@admin.com)(objectclass=organizationalPerson))]: javax.naming.InterruptedNamingException: Interrupted while waiting for the connection pool lock at java.naming/com.sun.jndi.ldap.pool.Connections.grabLock(Connections.java:366) at java.naming/com.sun.jndi.ldap.pool.Pool.getPooledConnection(Pool.java:140) at java.naming/com.sun.jndi.ldap.LdapPoolManager.getLdapClient(LdapPoolManager.java:341) at java.naming/com.sun.jndi.ldap.LdapClient.getInstance(LdapClient.java:1608) at java.naming/com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2848) at java.naming/com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:348) at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxFromUrl(LdapCtxFactory.java:229) at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:189) at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:247) at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:154) at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:84) at java.naming/javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:732) at java.naming/javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:305) at java.naming/javax.naming.InitialContext.init(InitialContext.java:236) at java.naming/javax.naming.ldap.InitialLdapContext.<init>(InitialLdapContext.java:154) at org.keycloak.storage.ldap.idm.store.ldap.LDAPContextManager.createLdapContext(LDAPContextManager.java:74) at org.keycloak.storage.ldap.idm.store.ldap.LDAPContextManager.getLdapContext(LDAPContextManager.java:93) at org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.execute(LDAPOperationManager.java:709) at org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.execute(LDAPOperationManager.java:704) at org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.search(LDAPOperationManager.java:255) at org.keycloak.storage.ldap.idm.store.ldap.LDAPIdentityStore.fetchQueryResults(LDAPIdentityStore.java:278) at org.keycloak.storage.ldap.idm.query.internal.LDAPQuery.getResultList(LDAPQuery.java:174) at org.keycloak.storage.ldap.idm.query.internal.LDAPQuery.getFirstResult(LDAPQuery.java:185) at org.keycloak.storage.ldap.LDAPStorageProvider.queryByEmail(LDAPStorageProvider.java:745) at org.keycloak.storage.ldap.LDAPStorageProvider.getUserByEmail(LDAPStorageProvider.java:752) at org.keycloak.storage.UserStorageManager.lambda$getUserByEmail$20(UserStorageManager.java:426) at org.keycloak.utils.ServicesUtils.lambda$timeBoundOne$1(ServicesUtils.java:83) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.stream.SortedOps$RefSortingSink.end(SortedOps.java:400) at java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258) at java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258) at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:528) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:647) at org.keycloak.storage.UserStorageManager.getUserByEmail(UserStorageManager.java:426) at org.keycloak.models.cache.infinispan.UserCacheSession.getUserByEmail(UserCacheSession.java:419) at org.keycloak.userprofile.validator.DuplicateEmailValidator.validate(DuplicateEmailValidator.java:70) at org.keycloak.userprofile.AttributeValidatorMetadata.validate(AttributeValidatorMetadata.java:80) at org.keycloak.userprofile.DefaultAttributes.validate(DefaultAttributes.java:169) at org.keycloak.userprofile.DefaultUserProfile.validate(DefaultUserProfile.java:76) at org.keycloak.userprofile.DefaultUserProfile.update(DefaultUserProfile.java:104) at org.keycloak.authentication.requiredactions.UpdateProfile.processAction(UpdateProfile.java:75) at org.keycloak.services.resources.LoginActionsService.processRequireAction(LoginActionsService.java:1156) at org.keycloak.services.resources.LoginActionsService.requiredActionPOST(LoginActionsService.java:1090) at org.keycloak.services.resources.LoginActionsService$quarkusrestinvoker$requiredActionPOST_02b0bc04a277d23515b0317d630ef043b756d133.invoke(Unknown Source) at org.jboss.resteasy.reactive.server.handlers.InvocationHandler.handle(InvocationHandler.java:29) at io.quarkus.resteasy.reactive.server.runtime.QuarkusResteasyReactiveRequestContext.invokeHandler(QuarkusResteasyReactiveRequestContext.java:141) at org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext.run(AbstractResteasyReactiveContext.java:147) at io.quarkus.vertx.core.runtime.VertxCoreRecorder$14.runWith(VertxCoreRecorder.java:582) at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538) at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29) at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.base/java.lang.Thread.run(Thread.java:840) 2024-09-30 06:58:13,619 ERROR [org.keycloak.services.error.KeycloakErrorHandler] (executor-thread-7) Uncaught server error: org.keycloak.models.ModelException: LDAP Query failed at org.keycloak.storage.ldap.idm.query.internal.LDAPQuery.getResultList(LDAPQuery.java:178) at org.keycloak.storage.ldap.idm.query.internal.LDAPQuery.getFirstResult(LDAPQuery.java:185) at org.keycloak.storage.ldap.LDAPStorageProvider.queryByEmail(LDAPStorageProvider.java:745) at org.keycloak.storage.ldap.LDAPStorageProvider.getUserByEmail(LDAPStorageProvider.java:752) at org.keycloak.storage.UserStorageManager.lambda$getUserByEmail$20(UserStorageManager.java:426) at org.keycloak.utils.ServicesUtils.lambda$timeBoundOne$1(ServicesUtils.java:83) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.stream.SortedOps$RefSortingSink.end(SortedOps.java:400) at java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258) at java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258) at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:528) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:647) at org.keycloak.storage.UserStorageManager.getUserByEmail(UserStorageManager.java:426) at org.keycloak.models.cache.infinispan.UserCacheSession.getUserByEmail(UserCacheSession.java:419) at org.keycloak.userprofile.validator.DuplicateEmailValidator.validate(DuplicateEmailValidator.java:70) at org.keycloak.userprofile.AttributeValidatorMetadata.validate(AttributeValidatorMetadata.java:80) at org.keycloak.userprofile.DefaultAttributes.validate(DefaultAttributes.java:169) at org.keycloak.userprofile.DefaultUserProfile.validate(DefaultUserProfile.java:76) at org.keycloak.userprofile.DefaultUserProfile.update(DefaultUserProfile.java:104) at org.keycloak.authentication.requiredactions.UpdateProfile.processAction(UpdateProfile.java:75) at org.keycloak.services.resources.LoginActionsService.processRequireAction(LoginActionsService.java:1156) at org.keycloak.services.resources.LoginActionsService.requiredActionPOST(LoginActionsService.java:1090) at org.keycloak.services.resources.LoginActionsService$quarkusrestinvoker$requiredActionPOST_02b0bc04a277d23515b0317d630ef043b756d133.invoke(Unknown Source) at org.jboss.resteasy.reactive.server.handlers.InvocationHandler.handle(InvocationHandler.java:29) at io.quarkus.resteasy.reactive.server.runtime.QuarkusResteasyReactiveRequestContext.invokeHandler(QuarkusResteasyReactiveRequestContext.java:141) at org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext.run(AbstractResteasyReactiveContext.java:147) at io.quarkus.vertx.core.runtime.VertxCoreRecorder$14.runWith(VertxCoreRecorder.java:582) at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538) at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29) at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.base/java.lang.Thread.run(Thread.java:840) Caused by: org.keycloak.models.ModelException: Querying of LDAP failed org.keycloak.storage.ldap.idm.query.internal.LDAPQuery@3f9d2d87 at org.keycloak.storage.ldap.idm.store.ldap.LDAPIdentityStore.fetchQueryResults(LDAPIdentityStore.java:294) at org.keycloak.storage.ldap.idm.query.internal.LDAPQuery.getResultList(LDAPQuery.java:174) ... 38 more Caused by: javax.naming.InterruptedNamingException: Interrupted while waiting for the connection pool lock at java.naming/com.sun.jndi.ldap.pool.Connections.grabLock(Connections.java:366) at java.naming/com.sun.jndi.ldap.pool.Pool.getPooledConnection(Pool.java:140) at java.naming/com.sun.jndi.ldap.LdapPoolManager.getLdapClient(LdapPoolManager.java:341) at java.naming/com.sun.jndi.ldap.LdapClient.getInstance(LdapClient.java:1608) at java.naming/com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2848) at java.naming/com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:348) at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxFromUrl(LdapCtxFactory.java:229) at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:189) at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:247) at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:154) at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:84) at java.naming/javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:732) at java.naming/javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:305) at java.naming/javax.naming.InitialContext.init(InitialContext.java:236) at java.naming/javax.naming.ldap.InitialLdapContext.<init>(InitialLdapContext.java:154) at org.keycloak.storage.ldap.idm.store.ldap.LDAPContextManager.createLdapContext(LDAPContextManager.java:74) at org.keycloak.storage.ldap.idm.store.ldap.LDAPContextManager.getLdapContext(LDAPContextManager.java:93) at org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.execute(LDAPOperationManager.java:709) at org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.execute(LDAPOperationManager.java:704) at org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.search(LDAPOperationManager.java:255) at org.keycloak.storage.ldap.idm.store.ldap.LDAPIdentityStore.fetchQueryResults(LDAPIdentityStore.java:278) ... 39 more
场景2:其他版本及管理API失效问题
- 23.0.5版本也存在相同的本地用户操作失效问题。
- 若LDAP配置错误,以下管理API在25.0.2、25.0.6、23.0.3版本中同样无法正常工作:
- URI:
https://<keycloak-domain>/admin/realms/myrealm/users?first=0&max=11&search=*
- URI:
内容的提问来源于stack exchange,提问作者Amol Inamdar
相关产品推荐
相关产品推荐

