为什么 keycloak 将 "Service-account-admin-cli" 用户隐藏在 "Users" 部分下?

Why does keycloak hide the "Service-account-admin-cli" user under "Users" section?

我试图调用 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”

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

您需要先访问客户 --> admin_cli --> 会话:

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

然后,之前的POST请求将成功创建一个新用户。

我无法理解为什么这个用户“Service-account-admin-cli”隐藏在用户部分下:

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

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

Keycloak 文档中可以阅读:

When you boot Keycloak for the first time Keycloak creates a pre-defined realm for you. This initial realm is the master realm. It is the highest level in the hierarchy of realms. Admin accounts in this realm have permissions to view and manage any other realm created on the server instance. When you define your initial admin account, you create an account in the master realm. Your initial login to the admin console will also be via the master realm.

We recommend that you do not use the master realm to manage the users and applications in your organization. Reserve use of the master realm for super admins to create and manage the realms in your system. Following this security model helps prevent accidental changes and follows the tradition of permitting user accounts access to only those privileges and powers necessary for the successful completion of their current task.

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

据说使用 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

Does keycloak expect people to find it by clicking clients --> admin_cli --> Sessions

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

按照此设置,然后您:

You need to first go to clients --> admin_cli --> Sessions:

您会看到以下内容:

现在的区别在于,如果您单击 admin 用户 > 角色,您将看到以下内容:

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

configure such that it has admin role

现在,如果您完全按照原来的方式更改 admin_cli 配置,则需要向 Service-account-admin-cli 用户添加管理员角色。

I cannot understand why this user "Service-account-admin-cli" is hidden under the users section:

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

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

  1. 不是常规意义上的真实用户;并不意味着用于登录 Keycloak。如果您尝试设置该 用户 的密码,您总是会得到一个错误。

  2. 用户列表是针对那些可以实际明确验证的领域明确创建的用户。换句话说,使用“Service-account-admin-cli”是为了代表执行对 admin-cli 的调用的“一个”,因为当一个人将 grand 类型从client-credentials 的密码不再有明确的用户身份验证( 管理员用户名和密码)。所以“Service-account-admin-cli”被用作占位符。

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

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

刚做了同样的教程,遇到了同样的问题。感谢您的 post!它帮助我找到了解决方案。我不知道这是不是因为更新的 Keycloak-version 但我什至没有看到 service-account.

的会话

您可以转到:

,而不是通过 session-menu

客户端 -> admin-cli -> 服务帐户角色

然后添加“manage-users”来自:

客户端角色 -> realm-management

我认为它应该是这样工作的。