7.5. 구성 기술
PropertyFileUserStorageProvider
예제가 약간 사용됩니다. 이는 공급자의 ScanSetting에 포함된 속성 파일로 하드 코딩되며, 이는 매우 유용하지 않습니다. 공급자의 인스턴스별로 구성 가능한 이 파일의 위치를 만들 수 있습니다. 즉, 이 공급자를 여러 영역에서 여러 번 재사용하고 완전히 다른 사용자 속성 파일을 가리킬 수 있습니다. 또한 Admin Console UI에서 이 구성을 수행해야 합니다.
UserStorageProviderFactory
에는 공급자 구성을 처리할 수 있는 추가 방법이 있습니다. 공급자별로 구성할 변수를 설명하고 Admin Console에서 일반 입력 페이지를 자동으로 렌더링하여 이 구성을 수집합니다. 구현된 경우 콜백 메서드도 구성을 저장하기 전에, 공급자가 처음 생성될 때 및 업데이트 시의 유효성을 검사합니다. UserStorageProviderFactory
는 org.keycloak.component.ComponentFactory
인터페이스에서 이러한 메서드를 상속합니다.
List<ProviderConfigProperty> getConfigProperties(); default void validateConfiguration(KeycloakSession session, RealmModel realm, ComponentModel model) throws ComponentValidationException { } default void onCreate(KeycloakSession session, RealmModel realm, ComponentModel model) { } default void onUpdate(KeycloakSession session, RealmModel realm, ComponentModel model) { }
ComponentFactory.getConfigProperties()
메서드는 org.keycloak.provider.ProviderConfigProperty
인스턴스 목록을 반환합니다. 이러한 인스턴스는 공급자의 각 구성 변수를 렌더링하고 저장하는 데 필요한 메타데이터를 선언합니다.
7.5.1. 구성 예
PropertyFileUserStorageProviderFactory
예제를 확장하여 디스크의 특정 파일에 공급자 인스턴스를 가리킬 수 있습니다.
PropertyFileUserStorageProviderFactory
public class PropertyFileUserStorageProviderFactory implements UserStorageProviderFactory<PropertyFileUserStorageProvider> { protected static final List<ProviderConfigProperty> configMetadata; static { configMetadata = ProviderConfigurationBuilder.create() .property().name("path") .type(ProviderConfigProperty.STRING_TYPE) .label("Path") .defaultValue("${jboss.server.config.dir}/example-users.properties") .helpText("File path to properties file") .add().build(); } @Override public List<ProviderConfigProperty> getConfigProperties() { return configMetadata; }
ProviderConfigurationBuilder
클래스는 구성 속성 목록을 만들 수 있는 유용한 도우미 클래스입니다. 여기서는 String 유형인 path
라는 변수를 지정합니다. 이 공급자의 Admin Console 구성 페이지에서 이 구성 변수는 Path
로 레이블이 지정되어 있으며 기본값은 ${jboss.server.config.dir}/example-users.properties
입니다. 이 구성 옵션의 툴팁 위에 마우스를 가져가면 도움말 텍스트, 파일 경로 속성 파일이
표시됩니다.
다음으로는 이 파일이 디스크에 있는지 확인하는 것입니다. 유효한 사용자 속성 파일을 가리키지 않는 한 이 공급자의 인스턴스를 활성화하려고 하지 않습니다. 이를 위해 validateConfiguration()
메서드를 구현합니다.
@Override public void validateConfiguration(KeycloakSession session, RealmModel realm, ComponentModel config) throws ComponentValidationException { String fp = config.getConfig().getFirst("path"); if (fp == null) throw new ComponentValidationException("user property file does not exist"); fp = EnvUtil.replace(fp); File file = new File(fp); if (!file.exists()) { throw new ComponentValidationException("user property file does not exist"); } }
validateConfiguration()
메서드에서 ComponentModel
에서 구성 변수를 가져오고 해당 파일이 디스크에 있는지 확인합니다. org.keycloak.common.util.EnvUtil.replace()
메서드를 사용합니다. 이 방법을 사용하면 ${}
가 포함된 모든 문자열이 시스템 속성 값으로 대체됩니다. ${jboss.server.config.dir}
문자열은 서버의 configuration/
디렉터리에 해당하며 이 예제에 매우 유용합니다.
다음으로 해야 할 것은 이전 init()
메서드를 제거하는 것입니다. 사용자 속성 파일이 공급자 인스턴스당 고유하므로 이 작업을 수행합니다. 이 논리를 create()
메서드로 이동합니다.
@Override public PropertyFileUserStorageProvider create(KeycloakSession session, ComponentModel model) { String path = model.getConfig().getFirst("path"); Properties props = new Properties(); try { InputStream is = new FileInputStream(path); props.load(is); is.close(); } catch (IOException e) { throw new RuntimeException(e); } return new PropertyFileUserStorageProvider(session, model, props); }
이 논리는 모든 트랜잭션이 디스크에서 전체 사용자 속성 파일을 읽을 때 비효율적이지만, 구성 변수에 연결하는 방법을 간단히 보여줍니다.
7.5.2. 관리 콘솔에서 공급자 구성
구성이 활성화되었으므로 Admin Console에서 공급자를 구성할 때 경로
변수를 설정할 수 있습니다.