上下文: Keycloak 1.9.1.Final和更新版本
您好,
我创建了一个自定义用户联合提供程序,它是Keycloak的类路径属性联合提供程序示例的简单变体。我不是在属性文件中读取用户名,而是从外部Web服务获取。
我的麻烦是,在尝试向测试用户进行身份验证时,有时会出现以下异常:
Failed authentication: java.lang.IllegalStateException: Cannot access delegate without a transaction
at org.keycloak.models.cache.infinispan.UserCacheSession.getDelegate(UserCacheSession.java:78)
at org.keycloak.models.cache.infinispan.UserCacheSession.addUser(UserCacheSession.java:442)
at com.example.keycloak.MyFederationProvider.getUserModel(MyFederationProvider.java:324)
at com.example.keycloak.MyFederationProvider.getUserByUsername(MyFederationProvider.java:206)
at org.keycloak.models.UserFederationManager.getUserByUsername(UserFederationManager.java:237)
at org.keycloak.models.utils.KeycloakModelUtils.findUserByNameOrEmail(KeycloakModelUtils.java:273)
at org.keycloak.authentication.authenticators.browser.AbstractUsernameFormAuthenticator.validateUserAndPassword(AbstractUsernameFormAuthenticator.java:127)
at org.keycloak.authentication.authenticators.browser.UsernamePasswordForm.validateForm(UsernamePasswordForm.java:56)
at org.keycloak.authentication.authenticators.browser.UsernamePasswordForm.action(UsernamePasswordForm.java:49)
at org.keycloak.authentication.DefaultAuthenticationFlow.processAction(DefaultAuthenticationFlow.java:84)
at org.keycloak.authentication.AuthenticationProcessor.authenticationAction(AuthenticationProcessor.java:759)
at org.keycloak.services.resources.LoginActionsService.processFlow(LoginActionsService.java:359)
at org.keycloak.services.resources.LoginActionsService.processAuthentication(LoginActionsService.java:341)
at org.keycloak.services.resources.LoginActionsService.authenticateForm(LoginActionsService.java:386)
...
我无法弄清楚为什么会发生这种异常。我查看了org.keycloak.models.cache.infinispan.UserCacheSession
类,我可以看到当transactionActive
变量为false时抛出异常,但我不明白它在什么条件下设置为false。
我尝试使用KeycloakModelUtils.runJobInTransaction()
方法强制进行交易,或者在begin()
电话周围添加commit()
和addUser()
,但它没有解决问题(我得到了一个通知该事务已处于活动状态的新错误。
您是否已经遇到此异常并知道如何避免它?
非常感谢
答案 0 :(得分:1)
我想我可以找到我的错误(或者至少是一个工作场所)。
我的用户联合提供程序的getInstance()
方法始终返回相同的对象(单个)。我更新了它,以便每次调用方法时都创建一个新的提供程序。
这似乎解决了这个问题。