Keycloak异常“无法在没有事务的情况下访问委托”

时间:2016-06-16 13:51:26

标签: java keycloak

上下文: 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(),但它没有解决问题(我得到了一个通知该事务已处于活动状态的新错误。

您是否已经遇到此异常并知道如何避免它?

非常感谢

1 个答案:

答案 0 :(得分:1)

我想我可以找到我的错误(或者至少是一个工作场所)。

我的用户联合提供程序的getInstance()方法始终返回相同的对象(单个)。我更新了它,以便每次调用方法时都创建一个新的提供程序。

这似乎解决了这个问题。