2016-06-16 3 views
0

상황 "트랜잭션없이 대리자를 액세스 할 수 없습니다" Keycloak의 classpath property 제휴 프로 바이더의 예 속성 파일에서 사용자 이름을 읽는 대신 외부 웹 서비스에서 가져옵니다. 이 예외 occures 이유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) 
    ... 

내가 알아낼 수 없습니다 :

내 문제는 테스트 사용자 인증을 시도 할 때 가끔 다음과 같은 예외를 얻을 수 있다는 것입니다. org.keycloak.models.cache.infinispan.UserCacheSession 클래스를 살펴보면 transactionActive 변수가 false 일 때 예외가 throw 된 것을 볼 수 있지만 어떤 조건에서는 false로 설정되어 있는지 이해할 수 없습니다.

나는 KeycloakModelUtils.runJobInTransaction() 방법 또는 addUser() 전화를 arround begin()commit()를 추가하여 거래를 강요했지만,이 문제를 (I 트랜잭션이 이미 활성화되어 있음을 알리는 새로운 오류가 발생했습니다) 해결되지 않았다.

이미이 예외가 발생했으며이를 피하는 방법을 알고 있습니까?

덕분에 많은

+0

"영역 설정"에서 영역 및 사용자 캐시를 강제로 재설정하고 즉시 Keycloak을 다시 시작하면 로그인이 한 번 작동합니다. 다른 로그인으로 로그인하면 예외가 발생합니다. – morbac

답변

0

나는 내 오류 (또는 적어도 workarround를) 찾을 수 있다고 생각.

내 사용자 연합 공급 업체의 getInstance() 메서드는 항상 동일한 개체 (싱글 톤)를 반환했습니다. 메서드를 호출 할 때마다 새 공급자를 만들도록 업데이트했습니다.

이것은 문제를 해결하는 것으로 보입니다.

관련 문제