Python Keycloak 获取用户的角色和组

Posted

技术标签:

【中文标题】Python Keycloak 获取用户的角色和组【英文标题】:Python Keycloak Get Roles and Groups of user 【发布时间】:2018-09-11 17:52:16 【问题描述】:

使用Key Cloak 创建组并为组分配角色。 然后创建用户并将用户分配到特定组。

要在我的应用程序中访问所有这些,我使用的是Python-Keycloak

如github doc 中所述,使用以下代码访问用户信息。

from keycloak import KeycloakOpenID

keycloak_openid = KeycloakOpenID(server_url="http://localhost:8080/auth/",
                    client_id="account",
                    realm_name="demo",
                    client_secret_key="my_secret_key")

config_well_know = keycloak_openid.well_know()

token = keycloak_openid.token("username", "password")
userinfo = keycloak_openid.userinfo(token['access_token'])

获取关注用户信息


    'family_name': 'Lastname', 
    'preferred_username': 'user_name', 
    'sub': 'some_key', 
    'given_name': 'Fistname', 
    'name': 'Firstname Lastname', 
    'email': 'email@example.com'

如何访问用户的组和角色信息。

【问题讨论】:

【参考方案1】:

您需要在同一个库中使用“KeycloakAdmin”类(python-keycloak):

from keycloak import KeycloakAdmin

admin = KeycloakAdmin(server_url='https://server-url',
                      username='username',
                      password='password',
                      realm_name='realm',
                      verify=True)

user_groups = admin.get_user_groups(user_id="user-id")

要使用 KeycloakAdmin,您需要一个有权访问“admin-cli”的用户。

【讨论】:

这会在试图获取令牌时死掉(当然是用我的凭据):/usr/local/lib/python3.6/site-packages/keycloak/keycloak_admin.py in __init__ self.get_token() … Local vars /usr/local/lib/python3.6/site-packages/keycloak/keycloak_admin.py in get_token self._token = self.keycloak_openid.token(self.username, self.password, grant_type=grant_type) … Local vars /usr/local/lib/python3.6/site-packages/keycloak/keycloak_openid.py in token return raise_error_from_response(data_raw, KeycloakGetError) 并且在 server_url 末尾带有反斜杠,它给出了这个错误:Exception Value: 401: b'"error":"invalid_grant","error_description":"Invalid user credentials"'。我的用户是管理员 您需要配置客户端密钥,1. 确保“服务帐户已启用” 2. 为其分配客户端角色 -> 领域管理客户端角色 -> 查看用户【参考方案2】:
    转到 Keycloak,选择您的客户端 -> 映射器 -> 创建。 在 Mapper Type 列表中选择“Group Membership”。 在令牌声明名称字段中指定所需的用户信息属性名称,例如“群组”。 在名称字段中指定您想要的映射器名称,然后单击保存。 再次尝试使用您的应用对 Keycloak 进行身份验证。用户组现在应该是 在用户信息 JSON 中可见。

【讨论】:

有趣的解决方案。因此,这实质上是将自定义字段添加到带有角色、组或其他可用信息的“用户信息”响应对象中。我理解正确吗? @Vasily Angapov 令牌声明名称字段的值“组”来自哪里?我正在尝试弄清楚 social-auth-app-django 包的等效项。 这应该是选择的答案。最干净的。【参考方案3】:

为我的领域创建了一个管理员用户。并像这样继承类

from keycloak import KeycloakAdmin
from keycloak.exceptions import raise_error_from_response, KeycloakGetError

class CustomKeycloakAdmin(KeycloakAdmin):
    def get_user_group(self,user_name):
        USER_GROUP_URL = "admin/realms/realm-name/users/user-id/groups"
        params_path = "user-id":self.get_user_id(user_name),"realm-name": self.realm_name
        data_raw = self.connection.raw_get(USER_GROUP_URL.format(**params_path))
        return raise_error_from_response(data_raw, KeycloakGetError)

if __name__=="__main__":
    keycloak_admin = CustomKeycloakAdmin(server_url="http://localhost:8080/auth/",username='admin_user',password='admin_password',realm_name="my_realm",verify=True)
    user_group = keycloak_admin.get_user_group("user_name")

【讨论】:

【参考方案4】:

我认为我们必须在 Keycloak 中为用户设置领域或客户端角色。 设置完成后,您将自动获取“user_groups”中的角色详细信息

干杯 新加坡

【讨论】:

【参考方案5】:

您还可以使用 keycloak API 来检索特定用户组和角色的详细信息

获取组详细信息的 CURL 示例: GET /realm/users/id/groups

curl 'http://keycloak.local:8000/auth/admin/realms/master/groups?first=0&max=20' \
  -H 'Connection: keep-alive' \
  -H 'Accept: application/json, text/plain, */*' \
  -H 'Authorization: Bearer <access_token>' \
  --compressed \
  --insecure

Users API可以参考keycloak官方文档keycloak Website

【讨论】:

以上是关于Python Keycloak 获取用户的角色和组的主要内容,如果未能解决你的问题,请参考以下文章

如何获取访问令牌中的角色:keycloak

Keycloak-向用户配置文件中添加角色

使用用户 SPI 在 Keycloak 中为外部用户分配角色

keycloak 无法在 access_token 中获取客户端角色

尝试获取“openid_id”和“角色”字段时,带有 Keycloak 的 Flask OIDC 返回 None

哪些角色允许 Keycloak 领域中的用户使用 Admin-REST-API?