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 获取用户的角色和组的主要内容,如果未能解决你的问题,请参考以下文章
使用用户 SPI 在 Keycloak 中为外部用户分配角色
keycloak 无法在 access_token 中获取客户端角色