2017-10-30 3 views
0

스프링 부트로 REST API를 만들고 인증 및 권한 부여를 위해 Keycloak을 사용하고 있습니다. 사용자는 Keycloak에 의해 관리되기 때문에 응용 프로그램 데이터베이스에는 사용자의 데이터가 없습니다. 그러나 사용자 데이터가 감사 목적으로 필요하므로 Keycloak의 User 엔터티 속성을 응용 프로그램 데이터베이스에 저장하려고합니다.Keycloak - 영역에 대한 모든 사용자를 얻고 응용 프로그램 데이터베이스에 저장하는 방법?

그럼 응용 프로그램 데이터베이스 사용자 테이블을 keycloak 사용자 테이블과 동기화하는 가장 좋은 방법은 무엇입니까?

+0

사용자를 모두 한 번에 불러야하거나 로그인 할 때이 작업을 수행 할 수 있습니까? – stdunbar

+0

사용자가 로그인 할 때 Keycloak 액세스 토큰 종점을 사용하여 로그인 할 때 사용자를 추가 할 수 없으므로 API에서 로그인 이벤트를 차단할 수 없습니다. –

답변

1

나는 EventListenerSpi을 기반으로 Keycloak 플러그인을 구현할 것입니다. EventListenerProvider 구현에서는 사용자 관리 이벤트에만 집중할 수 있습니다. 모든 사용자 데이터와 JSON 객체를 반환

public class SyncEventListener implements EventListenerProvider 
{ 
    private static final List<OperationType> SYNC_OPERATIONS = Arrays.asList(OperationType.CREATE, OperationType.UPDATE, OperationType.DELETE); 
    @Override 
    public void close() {} 

    @Override 
    public void onEvent(Event event) {} 

    @Override 
    public void onEvent(AdminEvent event, boolean includeRepresentation) 
    { 
    if ((event.getResourceType() == ResourceType.USER) && SYNC_OPERATIONS.contains(event.getOperationType())) 
    { 
     // Write user data to external message queue or database 
     externalStore.write(event.getOperationType(), event.getRepresentation()); 
    } 
    } 
} 

event.getRepresentation(). 물론이 작업을 수행하려면 Keycloak 관리 콘솔 (이벤트/구성/관리자 이벤트 설정)을 통해 관리자 이벤트를 켜야합니다. "이벤트 저장"및 "표현 포함"을 모두 ON으로 설정하십시오.

+0

답변 해 주셔서 감사합니다. 이 메소드를 구현하면 이벤트 객체에이 이름의 메소드가 없기 때문에 getResourceType()에 대한 오류가 발생합니다. 이 문제를 어떻게 해결할 수 있습니까? 또한이 파일 클래스를 내 REST API의 일부로 사용할 수 있습니까? –

+0

키 클로킹 라이브러리에 대한 종속성을 정의해야합니다. _compile 그룹 : 'org.keycloak', 이름 : 'keycloak-server-spi', 버전 : '3.3.0.Final'_ _compile 그룹 :'org.keycloak ', 이름 :'keycloak -server-spi-private ', 버전 :'3.3.0.Final'_ – Boomer