TencentCloud/TencentDB-Agent-Memory · error · MetadataError
permission_denied
permission_denied
Error message
user management requires system admin
What it means
MetadataError 'permission_denied' from deleteUsersForCaller: the supplied auth context fails canManageUsers, meaning only system admins may delete users. The check runs before any lookup or deletion, so the batch is rejected wholesale.
Solutions
- Re-authenticate as (or obtain a token for) a system_admin user
- Check the token/context carries admin role claims before calling; re-issue if role changed
- Handle 'permission_denied' in the UI by hiding admin actions for non-admins
Example fix
// before
await svc.deleteUsersForCaller(ids, normalUserCtx); // throws
// after
if (canManageUsers(ctx)) {
await svc.deleteUsersForCaller(ids, ctx);
} Defensive patterns
Strategy: validation
Validate before calling
if (!canManageUsers(ctx)) {
throw new Error('caller is not a system admin; refusing delete');
} Type guard
function isSystemAdminCtx(ctx: V3AuthContext): boolean {
return canManageUsers(ctx);
} Try / catch
try {
await svc.deleteUsersForCaller(ids, ctx);
} catch (e) {
if (e instanceof MetadataError && e.code === 'permission_denied') {
// show 403-equivalent UI state
} else throw e;
} Prevention
- Ensure admin tokens carry system admin role claims
- Gate admin UI actions on the same permission check client-side
- Re-authenticate after role changes so old non-admin tokens aren't reused
When it happens
Trigger: Calling deleteUsersForCaller with a V3AuthContext whose role/type is not system admin (e.g. normal user token, missing admin claims).
Common situations: Calling an admin-only endpoint with a regular user's token; tokens minted without admin role after an auth-provider config change; stale tokens issued before a role promotion.
Understand the failure class
Background: Permission denied / not authorized / 403 Forbidden: access-control rejections when the caller lacks the required role, grant, or ownership — this error's family across 18 libraries.
Related errors
AI-assisted analysis of TencentCloud/TencentDB-Agent-Memory@3efcd317b8 (2026-09-01).
Data as JSON: /api/errors/8f06770804b0ddb4.
Report an issue: GitHub.
Appendix: source
Thrown at MemoryCore/src/metadata/service/metadata-service.ts:517
}
return toPublicUser(user, ctx);
}
async getUserById(userId: string): Promise<UserEntity | null> {
return this.store.getUserById(userId);
}
async getUserByKey(userKey: string): Promise<UserEntity | null> {
return this.store.getUserByKey(userKey);
}
async getUserByExternalId(authProvider: string, externalId: string): Promise<UserEntity | null> {
return this.store.getUserByExternalId(authProvider, externalId);
}
async deleteUsersForCaller(userIds: string[], ctx: V3AuthContext): Promise<BatchDeleteResult> {
if (!canManageUsers(ctx)) {
throw new MetadataError("permission_denied", "user management requires system admin");
}
let deletingSystemAdmins = 0;
for (const id of userIds) {
const u = await this.getUserById(id);
if (u && isSystemAdminUser(u)) deletingSystemAdmins++;
}
const totalAdmins = await this.store.countSystemAdmins();
if (totalAdmins > 0 && totalAdmins - deletingSystemAdmins < 1) {
throw new MetadataError("last_system_admin", "cannot delete the last system_admin user");
}
return this.deleteUsers(userIds);
}
async deleteUsers(userIds: string[]): Promise<BatchDeleteResult> {
return this.store.deleteUsers(userIds);
}
async listUsersForCaller(View on GitHub (pinned to 3efcd317b8)