无法删除Consent Purposes:WSO2 IS v5.10.0技术问题求助
WSO2 IS v5.10.0 同意管理清理问题解决方案
问题场景
自行创建的Consent Purpose无法删除,返回错误:
{"code":"CM_00079","message":"错误请求","description":"用途ID:29关联了一个或多个同意凭证。"}
已删除数据库中所有用户,但通过REST API查询Consents时仍显示有用户记录(数据库用户表实际为空)。需解决:
- 删除已不在数据库但仍关联Consent的用户记录
- 清理所有Consent相关数据
- 撤销所有Consent
- 排查遗漏步骤
一、先解决CM_00079错误:清理关联的同意凭证
删除Purpose失败的核心原因是该Purpose关联了同意凭证(receipts),需先清理这些关联:
- 批量撤销所有同意记录:调用Consent管理API的撤销接口,对所有查询到的Consent执行撤销。
- 先调用
/api/identity/consent-mgt/v1.0/consents获取所有同意列表,拿到所有consentId - 对每个
consentId,调用POST /api/identity/consent-mgt/v1.0/consents/{consentId}/revoke执行撤销
- 先调用
- 数据库直接清理(API操作无效时用):
- 连接WSO2 IS的数据库(默认H2,生产环境多为MySQL/PostgreSQL等)
- 删除关联目标Purpose的同意凭证:
DELETE FROM CONSENT_RECEIPT WHERE PURPOSE_ID = 29; - 同步删除关联的凭证数据:
DELETE FROM CONSENT_RECEIPT_DATA WHERE RECEIPT_ID IN (SELECT ID FROM CONSENT_RECEIPT WHERE PURPOSE_ID = 29);
二、清理幽灵用户关联的Consent记录
数据库用户已删除但API仍显示关联,是因为Consent相关表未同步清理:
执行以下SQL清理无有效用户关联的Consent数据:
- 删除用户不存在的Consent记录:
DELETE FROM CONSENT WHERE USER_ID NOT IN (SELECT USER_ID FROM UM_USER); - 同步删除关联的同意凭证:
DELETE FROM CONSENT_RECEIPT WHERE CONSENT_ID IN (SELECT ID FROM CONSENT WHERE USER_ID NOT IN (SELECT USER_ID FROM UM_USER)); - 清理孤立的凭证数据:
DELETE FROM CONSENT_RECEIPT_DATA WHERE RECEIPT_ID NOT IN (SELECT ID FROM CONSENT_RECEIPT);
三、彻底清空所有Consent相关数据
如果需要完全清理所有Consent数据,按以下顺序操作:
- 先通过API撤销所有Consent(或直接执行数据库删除)
- 按顺序执行SQL清空表数据:
DELETE FROM CONSENT_RECEIPT_DATA; DELETE FROM CONSENT_RECEIPT; DELETE FROM CONSENT; - 最后删除目标Purpose:
DELETE FROM PURPOSE WHERE ID = 29;
注意:操作前确认该Purpose未关联其他未清理的资源
四、排查遗漏的步骤
你之前遗漏的核心操作:
- 直接删除数据库用户后,未同步清理Consent、Consent Receipt等关联表的残留数据,导致API读取到无效关联
- 删除Purpose前未先撤销或删除关联的同意凭证,触发了CM_00079依赖错误
内容的提问来源于stack exchange,提问作者FrankP
相关产品推荐
相关产品推荐

