代码之家  ›  专栏  ›  技术社区  ›  YQ.Wang

python keyclope assign_client_role()错误

  •  0
  • YQ.Wang  · 技术社区  · 7 年前

    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'
    

    似乎参数与函数中定义的参数不对应。我的代码引用了下面的示例 website .

    0 回复  |  直到 7 年前
        1
  •  2
  •   Azat Kossumov    6 年前

    也有同样的问题。事实证明,python keydeap的文档是不正确的。下面是我如何设法解决这个问题

    弗斯特 ,请确保您使用的是来自url的客户机标识,而不是来自keydocaper接口的客户机id(参见图片):

    client_id picture

    manage-users manage-clients 分配给它的角色:

    roles picture

    ,assign_client_role()接受参数role_name作为数组,而不是字符串

    我的代码是:

    keycloak_admin = KeycloakAdmin(server_url="http://localhost:8088/auth/",
                                            username='azat_admin',
                                            password='some_password',
                                            realm_name="realm_name",
                                            verify=True)
    
    new_user = keycloak_admin.create_user({"email": "some_email",
                                           "username": "some_username",
                                           "enabled": True,
                                           "firstName": "some_firstname",
                                           "lastName": "some_lastname",
                                           "credentials": [{"value": "some_password","type": "password",}]})
    
    roles = keycloak_admin.get_client_roles(client_id="2b50a8e3-dc91-4658-a552-83fb768badc8")
    keycloak_admin.assign_client_role(client_id = "2b50a8e3-dc91-4658-a552-83fb768badc8", 
                                                    user_id = new_user, 
                                                    roles=[roles[0]])
    
    
        2
  •  1
  •   Marcos Pereira Júnior    7 年前

    王。

    另一个选择是:

    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" .

        3
  •  0
  •   bsaverino    7 年前

    如示例文档中所述。你当然应该先试试:


    role_id=钥匙斗篷_admin.get\u client\u role\u id(client_id=client_id,role_name=“test”)

    然后

    #将客户端角色分配给用户。请注意,角色名称和角色标识似乎都是必需的。
    钥匙斗篷_管理员分配\客户端\角色(client_id=客户机_id,user_id=用户_id,角色_id=角色_id,角色_name=“测试”)

    或者你能分享更多你的代码,并解释为什么你评论了“role\u id”参数?

        4
  •  0
  •   YQ.Wang    7 年前

    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,如果其中一个参数出错,则会因为url不正确而出现404错误。参数内容 roles 角色 参数错误,可能会有500个错误。

    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"}])