7.5.2. 供应商工厂实施


现在,该提供商课程已经完成,现在我们把注意力转向了提供商的工厂级。

public class PropertyFileUserStorageProviderFactory
                 implements UserStorageProviderFactory<PropertyFileUserStorageProvider> {

    public static final String PROVIDER_NAME = "readonly-property-file";

    @Override
    public String getId() {
        return PROVIDER_NAME;
    }
Copy to Clipboard Toggle word wrap

首先需要注意的是,在实施 UserStorageProviderFactory 类时,您必须作为模板参数传递 concrete 提供程序类实施。此处我们指定我们在之前定义的提供程序类: PropertyFileUserStorageProvider

警告

如果没有指定模板参数,您的供应商将无法正常工作。运行时通过类内省来确定提供程序实施 的功能接口

getId () 方法标识运行时中的 factory,当您想要为域启用用户存储供应商时,admin 控制台也会显示字符串。

7.5.2.1. 初始化

    private static final Logger logger = Logger.getLogger(PropertyFileUserStorageProviderFactory.class);
    protected Properties properties = new Properties();

    @Override
    public void init(Config.Scope config) {
        InputStream is = getClass().getClassLoader().getResourceAsStream("/users.properties");

        if (is == null) {
            logger.warn("Could not find users.properties in classpath");
        } else {
            try {
                properties.load(is);
            } catch (IOException ex) {
                logger.error("Failed to load users.properties file", ex);
            }
        }
    }

    @Override
    public PropertyFileUserStorageProvider create(KeycloakSession session, ComponentModel model) {
        return new PropertyFileUserStorageProvider(session, model, properties);
    }
Copy to Clipboard Toggle word wrap

UserStorageProviderFactory 接口具有可实施的可选 init () 方法。当 Red Hat Single Sign-On 引导时,每个提供程序工厂仅创建一个实例。另外,init () 方法会在每次工厂实例上调用。您还可以实施 postInit () 方法。调用每个工厂的 init () 方法后,会调用其 postInit () 方法。

init () 方法实施中,我们找到含有 classpath 中用户声明的属性文件。然后,我们使用在其中存储的用户名和密码载入 properties 字段。

Config.Scope 参数是可在 standalone.xmlstandalone-ha.xmldomain.xml 中设置的工厂配置。

例如,将以下内容添加到 standalone.xml 中:

<spi name="storage">
    <provider name="readonly-property-file" enabled="true">
        <properties>
            <property name="path" value="/other-users.properties"/>
        </properties>
    </provider>
</spi>
Copy to Clipboard Toggle word wrap

我们可以指定用户属性文件的类路径,而不是硬编码。然后,您可以检索 PropertyFileUserStorageProviderFactory.init () 中的配置:

public void init(Config.Scope config) {
    String path = config.get("path");
    InputStream is = getClass().getClassLoader().getResourceAsStream(path);

    ...
}
Copy to Clipboard Toggle word wrap
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部