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

Keycloak自定义用户联邦和标识提供程序工作顺序

屠嘉勋
2023-03-14

我在KeyCloak上有两种自定义身份验证方法。

其中之一是自定义实现的用户联合。我为X王国配置了它。系统使用此实现以用户名/密码的方式进行登录。此实现调用我的联邦服务并验证发送的用户。它成功地工作并对联邦用户进行身份验证。

请分享你的经验。谢谢

共有1个答案

唐晗昱
2023-03-14

我遇到了相同的问题,身份提供程序和自定义用户联合不是同时工作的。我的解决方案不是阻止用户联合,而是更改自定义用户联合代码。从UserLookupProvider接口(getUserByEmail/username/id)返回用户的方法的实现必须经过编码以返回AbstractUserAdapterFederatedStorage。UserModel的这个实现为keycloak所需的方法提供了实现,这些方法用于从身份提供者内部化用户。另外,我实现了UserQueryProvider接口以及UserStorageProvider、UserLookupProvider、CredentialInputValidator,以便能够从keycloak管理控制台查看这些用户。

来自他们的文档:Keycloak附带了一个帮助类org.Keycloak.storage.adapter.AbstractUserAdapterFederatedStorage,它将把除get/set用户名之外的每个UserModel方法委托给用户联邦存储。

...接口UserQueryProvider。如果不实现此接口,则在管理控制台中将无法查看用户。不过,您仍然可以登录。

代码:注意:自定义keycloak用户存储应该至少有两个类。一个主要的任务是至少实现UserStorageProvider。另一个是调用这个类的工厂。在他们的服务器开发指南上有更多关于这一点的信息。下面的代码位于主类(而不是工厂)中:

@Override
    public UserModel getUserByUsername(String username, RealmModel realm) {

        [...]

            userModel = createUserModel(username, realm);

        [...]

        return userModel;
    }

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

            @Override
            public void setUsername(String username) {
//retrieves user through repository and sets the keycloak user to its username. (Seems redundant but works!)
                usersService.getUserDetails(username).setUsername(username);
                }
            };
        }
 类似资料:
  • 我正在尝试创建一个自定义的KeyClope提供程序,它将为登录逻辑添加一些内容。我已经读过如何为KeyClope创建提供者(或插件),我正在与之合作的项目中已经有一个提供者(或插件),但我对它们知之甚少。 我需要为用户身份验证/授权添加自定义逻辑:我希望能够检查内部数据库中的一些字段来验证人员帐户。但是我没有找到任何关于类似情况的指南或好文章。有人能给我提供一些关于从什么开始的链接吗?为了实现这样

  • 我将为我的网站创建自定义用户提供程序,对于用户来说,没有“用户名”和“密码”这样的概念(实际上有类似于密码的东西,但它的名称不同)。在文档中,用户实体必须实现来自安全包的UserInterface,该安全包具有诸如getUsername、getPassword之类的方法。我能用我自己的领域吗?或者我应该使用名称冲突(例如,getUsername将返回我的唯一字段)来实现我的行为吗?

  • 我有一个注册了< code>Keycloak的外部< code>openidconnect身份提供者。当客户端应用程序试图访问受保护的资源时,它会被重定向到< code>KeyCloak登录页面。在登录页面上,我启用了外部< code>openidconnect提供程序按钮。一旦用户单击该按钮,他将被带到外部身份提供者(即identityserver3实例)。外部提供商对用户进行身份验证并发回一个

  • 我正在尝试使用Keycloak(13.0.1)作为身份代理。我有一个iOS应用程序,它使用keycloak通过OIDC标识提供程序登录,然后使用令牌访问spring-boot后端。 我的问题是,我无法让keycloak注销也将用户从标识提供者会话中注销。 我花了几天时间在谷歌上搜索这个问题,并查看了stackoverflow和keycloak的讨论页面和git repo,但我找不到具体问题的答案。

  • 我正在使用Symfony Security和系统中的自定义用户提供程序。它通过web服务为用户提供服务。 我根据本教程配置提供程序(http://symfony.com/doc/current/cookbook/security/custom_provider.html). 这里是检查用户的功能: 这很好,函数使用用户名调用一个web服务,然后返回一个包含用户数据的数组。但是现在我需要通过另一个w