问题描述
我们正在使用 WSO2 SCIM apis 来定义用户角色并更新它。 对于角色更新操作,我们目前正在添加新用户角色(使用SCIM api将用户添加到新角色组),然后删除现有用户角色(在一个组下调用用户SCIM GET请求,删除列表中的现有用户,并使用新创建的列表作为主体参数来调用 GROUP 的 SCIM PATCH 请求)。通过这种方法,我们能够更新角色。但是随着用户群的增加,上述PATCH操作方法出现超时错误。(新角色更新为用户,但现有角色仍然存在,因为第二个api失败)。 >
以下是我尝试过的一种解决方案:
添加新角色,删除用户详细信息中新创建的角色,并使用更新后的用户角色调用 PATCH api。但后来在进一步调查中意识到用户内部的角色是只读的,不能使用补丁/放置操作更新。所以我没能找到合适的解决方案。
有没有办法在不使用 PATCH /Groups 端点的情况下更新 GROUP 内单个用户的角色?
解决方法
正如我在答案 https://stackoverflow.com/a/64225419/10055162 中提到的,SCIM 规范不允许使用 PATCH /Users/{userId}
更新用户的组属性。
此外,当群组成员数量过多时,PATCH /Groups/{groupId}
可能会导致性能问题。
WSO2 IS 在一定程度上提升了 PATCH /Groups/{groupId}
的性能。
- https://github.com/wso2/product-is/issues/6918 - 5.10.0 以后可用
- https://github.com/wso2/product-is/issues/9120 - 5.11.0 以后可用
因此,如果您使用的是旧版本的 IS,请尝试使用最新的 GA 版本 (5.11.0)。它可能会提高性能。
更新:
您可以使用 SCIM POST /Bulk
端点通过单个 REST 调用更新用户组,而不是通过多个 PATCH /Groups/{group-id}
调用。
有关批量端点的更多详细信息,请参阅 https://anuradha-15.medium.com/scim-2-0-bulk-operation-support-in-wso2-identity-server-5-10-0-8041577a4fe3。
示例:
要将两个组(Group1 和 Group2)分配给用户,请使用类似于以下内容的负载执行 POST https://<host>:<port>/scim2/Bulk
。
{
"Operations": [
{
"data": {
"Operations": [
{
"op": "add","value": {
"members": [
{
"display": "anuradha","value": "db15b161-a205-454d-9da1-4a2a0df0585e"
}
]
}
}
]
},"method": "PATCH","path": "/Groups/f707b6cc-91f8-4b8a-97fb-a01c2a79515c"
},{
"data": {
"Operations": [
{
"op": "add","path": "/Groups/8c91215f-1b7a-4cdb-87d9-ae29c60d70de"
}
],"schemas": [
"urn:ietf:params:scim:api:messages:2.0:BulkRequest"
]
}