2016-06-16 15 views
0

コンテキスト「トランザクションなしデリゲートにアクセスできません」 Keycloakのクラスパスプロパティのフェデレーションプロバイダの例プロパティファイルでユーザー名を読み取るのではなく、外部Webサービスから取得します。Keycloak例外は

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) 
    ... 

この例外はoccures、なぜ私が理解することはできません。

私のトラブルは、テストユーザーを認証しようとすると、時々、私は次の例外を取得していることです。私はorg.keycloak.models.cache.infinispan.UserCacheSessionクラスを見て、transactionActive変数がfalseのときに例外がスローされることがわかりましたが、どのような条件でfalseに設定されているのか分かりません。

私はKeycloakModelUtils.runJobInTransaction()メソッドまたはaddUser()呼び出しarroundのbegin()commit()を追加することによって、トランザクションを強制的に試みたが、それは(私はトランザクションがすでにアクティブであることを通知し、新たなエラーが発生しました)問題を解決していませんでした。

既にこの例外が発生していて、回避する方法は知っていましたか?

ありがとうたくさん

+0

「領域設定」で領域とユーザーキャッシュを強制的にリセットしてすぐにKeycloakを再起動すると、ログインは一度しか機能しません。別のログインでログインすると、例外が発生します。 – morbac

答えて

0

私のエラー(または少なくともworkarround)が見つかりました。

ユーザー連合プロバイダのgetInstance()メソッドは、常に同じオブジェクト(シングルトン)を返していました。メソッドが呼び出されるたびに新しいプロバイダを作成するために、このメソッドを更新しました。

これは問題を解決するようです。