python-keycloak assign_client_role () ошибка - PullRequest
0 голосов
/ 27 апреля 2019

Я использую Python Keycloak API для назначения пользовательских ролей.Вот код:

from keycloak import KeycloakAdmin
# make connection        
admin = KeycloakAdmin(server_url = "https://xxx.xx.xx/auth/",
                                   username = 'xx',
                                   password = 'xxx',
                                   realm_name = "xxx-xxx",
                                   verify = True)
# get an user id via user name
userID = admin.get_user_id(self.userName)
# assign user role
admin.assign_client_role(client_id = "client_id", 
                             user_id = userID, 
                             #role_id = "role_id", 
                             role_name = "test")

Часть make connection и get user id via user name выполнена успешно.Но assign_client_role() выдает мне ошибку:

TypeError: assign_client_role() got an unexpected keyword argument 'role_name'

Кажется, что аргументы не соответствуют аргументам, определенным в функции.Мой код ссылается на пример с этого веб-сайта .Может кто-нибудь сказать мне, как сделать это правильно?

Ответы [ 3 ]

0 голосов
/ 28 апреля 2019

Оказывается, что документация неверна, я проверяю исходный код keycloak_admin.py нашел определение функции assign_client_role():

def assign_client_role(self, user_id, client_id, roles):
    """
    Assign a client role to a user

    :param client_id: id of client (not client-id)
    :param user_id: id of user
    :param client_id: id of client containing role,
    :param roles: roles list or role (use RoleRepresentation)
    :return Keycloak server response
    """

    payload = roles if isinstance(roles, list) else [roles]
    params_path = {"realm-name": self.realm_name, "id": user_id, "client-id":client_id}
    data_raw = self.connection.raw_post(URL_ADMIN_USER_CLIENT_ROLES.format(**params_path),
                                    data=json.dumps(payload))
    return raise_error_from_response(data_raw, KeycloakGetError, expected_code=204)

URL_ADMIN_USER_CLIENT_ROLES определяется в urls_patterns.py:

URL_ADMIN_USER_CLIENT_ROLES = "admin/realms/{realm-name}/users/{id}/role-mappings/clients/{client-id}" Как вы можете видеть, realm-name, userid и client-id используются для формирования URL-адреса, если один из этих параметров выйдет из строя, произойдет ошибка 404 из-за неправильного URL-адреса. Содержимое параметра roles преобразуется в данные поста, поэтому, если формат параметра roles неправильный, вероятно, будет 500 ошибок.

Чтобы получить правильный пример URL и правильную структуру данных ролей, я использовал браузер, чтобы вручную назначить роль, и проверять URL и публиковать данные json, отправленные браузером. Затем измените код, чтобы получить правильные данные URL и JSON. Ниже приведен окончательный код, который работает:

from keycloak import KeycloakAdmin
# make connection        
admin = KeycloakAdmin(server_url = "https://xxx.xx.xx/auth/",
                      username = 'xx',
                      password = 'xxx',
                      realm_name = "xxx-xxx",
                      verify = True)
# get user id
userID = admin.get_user_id('one user's name')
# make sure you have the right realm name
realmName = 'xxx-xxx'
clientID = admin.get_client_id(realmName)
admin.assign_client_role(user_id = userID,
                         client_id = clientID, 
                         roles = [{"id":"34a02t60-2435-40da-v911-a3ee1xm58921",
                                   "name":"USER",
                                   "description":"xxxxx",
                                   "composite":False,
                                   "clientRole":True,
                                   "containerId":"aa102d71-4jk1-4u2a-a8w4-a6cv5j7626i1"}])
0 голосов
/ 28 июня 2019

Wang.

Другой вариант:

from keycloak import KeycloakAdmin

# make connection            
admin = KeycloakAdmin(server_url = "https://xxx.xx.xx/auth/",
                                   username = 'xx',
                                   password = 'xxx',
                                   realm_name = "xxx-xxx",
                                   verify = True)
# get an user id via user name
user_id = admin.get_user_id("username")

role = admin.get_client_roles(client_id="client_id", role_name="test")

# assign user client role
admin.assign_client_role(client_id = "client_id", 
                         user_id = user_id, 
                         roles=[role])

Я исправлю документацию об этом.

Новый официальный репозиторий - "python-keycloak ".

0 голосов
/ 28 апреля 2019

Как указано в примере документации. Вы должны сначала попробовать:

# Получить идентификатор роли клиента из имени
role_id = keycloak_admin.get_client_role_id (client_id = client_id, role_name = "test")

тогда

# Назначить роль клиента пользователю. Обратите внимание, что ОБА имя-роли и идентификатор-роли, по-видимому, необходимы.
keycloak_admin.assign_client_role (client_id = client_id, user_id = user_id, role_id = role_id, role_name = "test")

Или вы можете поделиться своим кодом и объяснить, почему вы прокомментировали аргумент 'role_id'?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...