7.7. 增强外部存储

PropertyFileUserStorageProvider 示例实际上有限。虽然我们可以使用存储在属性文件中的用户登录,但我们将无法做其他工作。如果此提供程序加载的用户需要特殊的角色或组映射来完全访问特定应用程序,我们就无法向这些用户添加其他角色映射。您也可以修改或添加其他重要属性,如电子邮件、名字和姓氏。

对于这些类型的问题,Red Hat Single Sign-On 允许您通过在 Red Hat Single Sign-On 的数据库中存储额外信息来增强外部存储。这称为联合用户存储,并封装在 org.keycloak.storage.federated.UserFederatedStorageProvider 类中。

UserFederatedStorageProvider

package org.keycloak.storage.federated;

public interface UserFederatedStorageProvider extends Provider {

    Set<GroupModel> getGroups(RealmModel realm, String userId);
    void joinGroup(RealmModel realm, String userId, GroupModel group);
    void leaveGroup(RealmModel realm, String userId, GroupModel group);
    List<String> getMembership(RealmModel realm, GroupModel group, int firstResult, int max);

...

UserFederatedStorageProvider 实例可在 KeycloakSession.userFederatedStorage () 方法中找到。它具有存储属性、组和角色映射、不同凭据类型和所需操作的所有不同类型的方法。如果您的外部存储的数据model 无法支持完整的 Red Hat Single Sign-On 功能集,则该服务可能会填补空白。

Red Hat Single Sign-On 附带了帮助类 org.keycloak.storage.adapter.AbstractUserAdapterFederatedStorage,除了 get/set of username to user federated storage 之外。覆盖您需要覆盖的方法,以委派给外部存储表示法。强烈建议您阅读本课程的 javadoc,因为它有较小的受保护的方法。具体围绕组成员资格和角色映射。

7.7.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 () 方法更改属性文件并保存它。