7.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) 方法上可用。它具有存储属性、组和角色映射、不同凭证类型和所需操作的所有不同类型的方法。如果您的外部存储的数据型号不支持红帽构建的 Keycloak 功能集,则该服务可能会填补差距。
红帽 Keycloak 的构建附带一个帮助程序类 org.keycloak.storage.adapter.AbstractUserAdapterFederatedStorage,它将把每个单用户 Model 方法委托给用户联邦存储。覆盖您需要覆盖的方法,以委派给您的外部存储表示法。强烈建议您阅读此类的 javadoc,因为它有较小的保护方法,您可能需要覆盖。专门围绕组成员资格和角色映射。
7.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 () 方法更改属性文件并保存它。