7.5. 구성 기술


PropertyFileUserStorageProvider 예제가 약간 사용됩니다. 이는 공급자의 ScanSetting에 포함된 속성 파일로 하드 코딩되며, 이는 매우 유용하지 않습니다. 공급자의 인스턴스별로 구성 가능한 이 파일의 위치를 만들 수 있습니다. 즉, 이 공급자를 여러 영역에서 여러 번 재사용하고 완전히 다른 사용자 속성 파일을 가리킬 수 있습니다. 또한 Admin Console UI에서 이 구성을 수행해야 합니다.

UserStorageProviderFactory 에는 공급자 구성을 처리할 수 있는 추가 방법이 있습니다. 공급자별로 구성할 변수를 설명하고 Admin Console에서 일반 입력 페이지를 자동으로 렌더링하여 이 구성을 수집합니다. 구현된 경우 콜백 메서드도 구성을 저장하기 전에, 공급자가 처음 생성될 때 및 업데이트 시의 유효성을 검사합니다. UserStorageProviderFactoryorg.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에서 공급자를 구성할 때 경로 변수를 설정할 수 있습니다.

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.