【问题标题】:Why does keycloak hide the "Service-account-admin-cli" user under "Users" section?为什么 keycloak 隐藏“用户”部分下的“服务帐户管理员 cli”用户?
【发布时间】:2021-04-20 10:51:06
【问题描述】:

我试图调用 keycloak 的 REST api 在领域下创建新用户,我正在关注本教程: https://www.appsdeveloperblog.com/keycloak-rest-api-create-a-new-user/

我能够如下配置Admin-cli 客户端: 并且我能够通过使用客户端 ID 和密码来获取访问令牌:

但是,当我使用不记名令牌向 /auth/admin/realms/myapp/users 发出 POST 请求时,它无法创建用户并且我收到“unknow_error”

我搜索了互联网、社区和文档,但没有任何线索。最终经过数小时的尝试,我找到了解决方案:

你需要先去clients --> admin_cli --> Sessions:

然后单击用户“Service-account-admin-cli”并进行配置,使其具有管理员角色

那么,之前的 POST 请求就会成功创建一个新用户。

我不明白为什么这个用户“Service-account-admin-cli”隐藏在用户部分下:

为什么要隐藏???人们应该如何找到该用户(Service-account-admin-cli)并对其进行配置? keycloak 是否希望人们通过单击 clients --> admin_cli --> Sessions 找到它,然后从那里看到用户??

【问题讨论】:

    标签: keycloak keycloak-rest-api


    【解决方案1】:

    如果有人开始学习 Keycloak,IMO 应该避免使用 master 领域或更改 admin_cli 配置,因为没有很好的理由。

    Keycloak 文档中可以阅读:

    当你第一次启动 Keycloak 时,Keycloak 会创建一个 为您预定义的领域。这个初始境界就是主境界。它 是领域层次结构中的最高级别。管理员帐户在 此领域有权查看和管理创建的任何其他领域 在服务器实例上。 当您定义初始管理员帐户时, 您在主域中创建一个帐户。您首次登录 管理控制台也将通过主领域。

    我们建议您不要使用主域来管理用户 和您组织中的应用程序。 保留对主领域的使用 供超级管理员创建和管理系统中的领域。 遵循此安全模型有助于防止意外更改和 遵循只允许用户帐户访问那些 成功完成其任务所需的特权和权力 当前任务。

    所以通常你会创建一个不同的领域,并在那里创建用户。除非,您真的想在 master 领域创建一个用户,通常是 admin 类似的用户。

    据说使用 Keycloak Rest API 创建用户,只需要通过提供其名称和密码,代表管理员用户从 admin-cli 客户端请求一个令牌,对于实例如下:

    TOKEN=$(curl -k -sS     -d "client_id=admin-cli" \
                            -d "username=$ADMIN_NAME" \
                            -d "password=$ADMIN_PASSWORD" \
                            -d "grant_type=password" \
                            http://$KEYCLOAK_IP/auth/realms/master/protocol/openid-connect/token)
    

    从 $TOKEN 对象中提取访问令牌(让我们命名为 $ACCESS_TOKEN)。

    然后创建用户如下:

    curl -k -sS -X POST https://$KEYCLOAK_IP/auth/admin/realms/$REALM_NAME/users \
            -H "Content-Type: application/json" \
            -H "Authorization: Bearer $ACCESS_TOKEN" \
            -d "$USER_JSON_DATA"
    

    $USER_JSON_DATA 将是要创建的用户的 json 数据表示。默认情况下,使用 Keycloak 部署的 master admin 无需添加角色 admin

    keycloak 是否希望人们通过点击客户端来找到它 --> admin_cli --> 会话

    如果设置正常,您只需要知道(正如我已经描述的)管理员的名称和密码,无论如何都是在初始设置中配置的。

    按照此设置,您:

    你需要先去clients --> admin_cli --> Sessions:

    您会看到以下内容:

    现在不同的是,如果你点击admin用户>角色,你会看到如下:

    admin 用户已经拥有 admin 角色。不需要:

    配置使其具有管理员角色

    现在,如果您完全按照您所做的那样更改 admin_cli 配置,那么您需要将角色 admin 添加到 Service-account-admin-cli 用户。

    我不明白为什么这个用户“Service-account-admin-cli”是 隐藏在用户部分下:

    这是一个实现细节,不幸的是,我在网上也找不到对此的解释。但我确实同意,如果没有进一步的上下文,它看起来不太友好。现在引出了一个问题,为什么教程没有警告他们的读者。

    现在,如果有人推测一下,从用户列表中隐藏该用户的原因可能是:

    1. 它不是传统意义上的真实用户;不打算用于登录 Keycloak。如果你尝试设置那个用户的密码,你总是会得到一个错误。

    2. 用户列表是为该领域显式创建的用户,实际上可以显式地进行身份验证。换句话说,使用“Service-account-admin-cli”,以便它代表执行对 admin-cli 的调用的“一个”,因为当一个将大类型从密码更改为 client-credentials 不再有明确的用户身份验证(ie, 管理员用户名和密码)。所以使用“Service-account-admin-cli”作为占位符。

    当然,人们可能会争辩为什么不让“Service-account-admin-cli”默认具有管理员角色?!但同样是实现细节,只有背后的开发人员才能证明。

    另一个不盲目更改admin-cli的原始设置的好理由。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-02-16
      • 2017-04-29
      • 2019-05-17
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多