5.2. 供应商接口


在构建用户存储 SPI 的实现时,您必须定义供应商类和供应商工厂。供应商类实例会根据供应商工厂为每个事务创建。供应商类会对用户查找和其他用户操作进行大量工作。它们必须实施 org.keycloak.storage.UserStorageProvider 接口。

package org.keycloak.storage;

public interface UserStorageProvider extends Provider {


    /**
     * Callback when a realm is removed.  Implement this if, for example, you want to do some
     * cleanup in your user storage when a realm is removed
     *
     * @param realm
     */
    default
    void preRemove(RealmModel realm) {

    }

    /**
     * Callback when a group is removed.  Allows you to do things like remove a user
     * group mapping in your external store if appropriate
     *
     * @param realm
     * @param group
     */
    default
    void preRemove(RealmModel realm, GroupModel group) {

    }

    /**
     * Callback when a role is removed.  Allows you to do things like remove a user
     * role mapping in your external store if appropriate

     * @param realm
     * @param role
     */
    default
    void preRemove(RealmModel realm, RoleModel role) {

    }

}
Copy to Clipboard Toggle word wrap

您可能会认为 UserStorageProvider 接口是稀疏的?本章稍后会看到,您的供应商可以实施其他混合接口来支持用户集成的机制。

UserStorageProvider 实例会在每次事务创建一次。当事务完成后,会调用 UserStorageProvider.close () 方法,然后收集实例。实例由供应商工厂创建。Provider factories 实施 org.keycloak.storage.UserStorageProviderFactory 接口。

package org.keycloak.storage;

/**
 * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
 * @version $Revision: 1 $
 */
public interface UserStorageProviderFactory<T extends UserStorageProvider> extends ComponentFactory<T, UserStorageProvider> {

    /**
     * This is the name of the provider and will be shown in the admin console as an option.
     *
     * @return
     */
    @Override
    String getId();

    /**
     * called per Keycloak transaction.
     *
     * @param session
     * @param model
     * @return
     */
    T create(KeycloakSession session, ComponentModel model);
...
}
Copy to Clipboard Toggle word wrap

在实施 UserStorageProviderFactory 时,供应商工厂类必须将 concrete 供应商类指定为 template 参数。这必须作为运行时内省此类,以扫描其功能(它所实施的其他接口)。例如,如果您的供应商类命名为 FileProvider,则 factory 类应类似如下:

public class FileProviderFactory implements UserStorageProviderFactory<FileProvider> {

    public String getId() { return "file-provider"; }

    public FileProvider create(KeycloakSession session, ComponentModel model) {
       ...
    }
Copy to Clipboard Toggle word wrap

getId () 方法返回 User Storage 提供程序的名称。当您要为特定域启用供应商时,管理控制台的 User Federation 页面中会显示此 id。

create () 方法负责分配提供程序类的实例。它采用 org.keycloak.models.KeycloakSession 参数。此对象可用于查找其他信息和元数据,并提供对运行时中各种其他组件的访问。ComponentModel 参数代表如何在特定域中启用和配置提供程序。它包含已启用供应商的实例 ID,以及在通过管理控制台启用时为它指定的任何配置。

UserStorageProviderFactory 还有其他功能,我们将在本章后续部分中介绍它们。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat