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) {
}
}
您可能会认为 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);
...
}
在实施 UserStorageProviderFactory 时,供应商工厂类必须将 concrete 供应商类指定为 template 参数。这必须作为运行时内省此类,以扫描其功能(它所实施的其他接口)。例如,如果您的供应商类命名为 FileProvider,则 factory 类应类似如下:
public class FileProviderFactory implements UserStorageProviderFactory<FileProvider> {
public String getId() { return "file-provider"; }
public FileProvider create(KeycloakSession session, ComponentModel model) {
...
}
getId () 方法返回 User Storage 提供程序的名称。当您要为特定域启用供应商时,管理控制台的 User Federation 页面中会显示此 id。
create () 方法负责分配提供程序类的实例。它采用 org.keycloak.models.KeycloakSession 参数。此对象可用于查找其他信息和元数据,并提供对运行时中各种其他组件的访问。ComponentModel 参数代表如何在特定域中启用和配置提供程序。它包含已启用供应商的实例 ID,以及在通过管理控制台启用时为它指定的任何配置。
UserStorageProviderFactory 还有其他功能,我们将在本章后续部分中介绍它们。