为啥 keycloak 隐藏“用户”部分下的“服务帐户管理员 cli”用户?

Posted

技术标签:

【中文标题】为啥 keycloak 隐藏“用户”部分下的“服务帐户管理员 cli”用户?【英文标题】: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 找到它,然后从那里看到用户??

【问题讨论】:

【参考方案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”是 隐藏在用户部分下:

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

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

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

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

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

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

【讨论】:

以上是关于为啥 keycloak 隐藏“用户”部分下的“服务帐户管理员 cli”用户?的主要内容,如果未能解决你的问题,请参考以下文章

KeyCloak用户rest api返回403禁止,为啥?

如何在 Keycloak 中授予部分用户部分用户管理权限?

为啥 keycloak 会删除重定向 uri 中的 SSL?

为啥我收到 Spring Security 和 Keycloak 的“访问被拒绝”错误?

为啥'id'在keycloak中被称为'sub'?

为啥 Keycloak 使用 Session-Cookie 而不是 JWT Authorization Header