当前位置: 首页 > 知识库问答 >
问题:

Keycloak用户存储SPI实现

厍浩广
2023-03-14

我试图解决的用例是

用户将显示keycloak登录屏幕。Onsubmission用户将根据外部数据源验证。

从外部数据源中检索一些属性,将其映射到KeyCloak的id和访问令牌。

我所做的是从实现自定义身份验证器SPI开始,认为这不是正确的方法,现在实现了UserStorageProvider。

/***
 * From UserLookupProvider
 */
public UserModel getUserById(String id, RealmModel realm) {
    System.out.println("ID: " + id + ":REALM:" + realm);
    StorageId storageId = new StorageId(id);
    /**
     * StorageId.getExternalId() method is invoked to obtain 
     * the username embeded in the id parameter
     */
    String username = storageId.getExternalId();
    System.out.println("Name:" + username);
    return getUserByUsername(username, realm);
}

/***
 * From UserLookupProvider
 * This method is invoked by the Keycloak login page when a user logs in
 */
public UserModel getUserByUsername(String username, RealmModel realm) {
    System.out.println("USERNAME: " + username + ":REALM:" + realm);
    UserModel userModel = loadedUsers.get(username);
    if (userModel == null) {
        String password = properties.getProperty(username);
        if (password != null) {
            userModel = createUserModel(realm, username);
            System.out.println("New UserModel:");
            System.out.println(userModel.toString());
            loadedUsers.put(username, userModel);
        }
    }
    return userModel;
}

protected UserModel createUserModel(RealmModel realm, String username) {
    return new AbstractUserAdapter(session, realm, model) {
        @Override
        public String getUsername() {
            return username;
        }
    };
}

遵循文档(https://www.keycloak.org/docs/latest/server_development/index.html#packaging-and-deployment-2)

提供程序实现的类文件应该放在一个JAR中。您还必须在meta-inf/services/org.keycloak.storage.UserStorageProviderFactory文件中声明provider工厂类。

如有任何建议/帮助,我们将不胜感激!!

谢谢你的建议。

暂时还没有答案

 类似资料:
  • 我已经实现了keycloak用户存储SPI流。它针对外部源进行身份验证。Keycloak是用外部存储属性更新的,如果它在getUserByUsername方法中更新,它就可以工作。 我正在isValid方法中验证userValidation,并更新UserModel和LocalHashMap中的userAttributes。 从日志中,我看到UserStoreProviderFactory创建了两

  • 创建了一个用户存储SPI,用于对外部数据库中的用户进行身份验证,可以在KeyCloak的“用户”页面中列出所有用户,用户可以从KeyCloak登录页面http://127.0.0.1:8080/auth/realms/dev/account/登录。但是如果我想从http://127.0.0.1:8080/auth/realms/dev/protocol/openid-connect/token获取

  • 我已经成功地设置了嵌入在Spring Boot应用程序中的Keycloak服务器,遵循本教程:嵌入在Spring Boot应用程序中的Keycloak以避免手动设置它。 由于我要处理的是一个已经有自己DB的旧实现,所以我决定使用Keycloak的用户存储SPI连接到外部postgresql DB,并使用它来进行身份验证,而不是Keycloak DB。 为此,我遵循了关于Keycloak文档的教程,

  • 我已经实现了一个自定义的Keycloak UserStorageProvider SPI(以下是官方文档https://www.Keycloak.org/docs/latest/server_development/index.html#_user-storage-spi的第11点),它执行以下操作: 根据外部身份验证服务对用户(以前不存在于本地存储中)进行身份验证。 将(针对自定义服务成功进行身

  • sql.conf中的read_groups指令的值可能由前一个管理员设置为no;将其更改为yes将激活所有用户的组表读取。 需要先安装freeradius-postgresql包。该软件包包含所需的设置文件以及PostgreSQL特定的FreeRADIUS模块。 不,您不对SQL数据库或文本文件进行身份验证,而是使用它们来存储凭据。然后,验证模块使用存储在文本文件或SQL数据库中的数据进行密码验证

  • 用户存储 用户存储是保存用户详细信息的地方。理想的情况是有一个单一的用户存储,使用不同的系统来使用这个单一的源。企业对这样一个存储的需求导致了目录的产生。Novell的edirectory、Microsoft的Active Directory和OpenLDAP都是目录的例子。 在WWW领域,谷歌和Facebook等流行的网络环境允许第三方通过网络服务使用他们的用户存储。 这使外部Web应用程序可以