6.8. 增加外部存储
PropertyFileUserStorageProvider 示例实际上有限。虽然我们将能够使用存储在属性文件中的用户登录,但我们无法执行许多其他操作。如果此提供程序加载的用户需要特殊的角色或组映射来完全访问特定应用程序,则无法向这些用户添加额外的角色映射。您还可以修改或添加其他重要属性,如电子邮件、名字和姓氏。
对于这些类型的情况,红帽构建的 Keycloak 允许您通过在红帽构建的 Keycloak 数据库中存储额外信息来增加外部存储。这称为联邦用户存储,并封装在 org.keycloak.storage.federated.UserFederatedStorageProvider 类中。
UserFederatedStorageProvider
package org.keycloak.storage.federated;
public interface UserFederatedStorageProvider extends Provider,
UserAttributeFederatedStorage,
UserBrokerLinkFederatedStorage,
UserConsentFederatedStorage,
UserNotBeforeFederatedStorage,
UserGroupMembershipFederatedStorage,
UserRequiredActionsFederatedStorage,
UserRoleMappingsFederatedStorage,
UserFederatedUserCredentialStore {
...
}
UserFederatedStorageProvider 实例在 UserStorageUtil.userFederatedStorage (KeycloakSession) 方法上提供。它有各种不同的方法来存储属性、组和角色映射、不同的凭证类型和所需操作。如果您的外部存储的 datamodel 无法支持完整的红帽构建的 Keycloak 功能集,则该服务可能会填补差距。
红帽构建的 Keycloak 附带了帮助程序类 org.keycloak.storage.adapter.AbstractUserAdapterFederatedStorage,它将把每个单个 UserModel 方法委托给用户联邦存储。覆盖您需要覆盖的方法,以委托给外部存储表示形式。强烈建议您阅读此类的 javadoc,因为它有较小的保护方法,您可能希望覆盖。特别是组成员资格和角色映射。
6.8.1. 8 月示例 复制链接链接已复制到粘贴板!
在我们的 PropertyFileUserStorageProvider 示例中,我们只需要对供应商进行简单的更改才能使用 AbstractUserAdapterFederatedStorage。
PropertyFileUserStorageProvider
protected UserModel createAdapter(RealmModel realm, String username) {
return new AbstractUserAdapterFederatedStorage(session, realm, model) {
@Override
public String getUsername() {
return username;
}
@Override
public void setUsername(String username) {
String pw = (String)properties.remove(username);
if (pw != null) {
properties.put(username, pw);
save();
}
}
};
}
相反,我们定义 AbstractUserAdapterFederatedStorage 的匿名类实现。setUsername () 方法更改属性文件并保存。