收口 Phase 0 三处「声明未生效」: - 三级鉴权落地:权限集存 Redis(key 前缀隔离多项目),@RequirePermissions 挂到全部受控接口,super_admin 角色绕过权限码与 data_scope - 审计/登录日志自动落库:@AuditLog 装饰器 + 拦截器异步写入(写操作+登录登出),登录成功/失败均记 login_log(脱敏) - seed 脚本:一键初始化租户 touyun/用户 touyun/超管 super_admin/全量资源树(48 资源全量授权) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
26 lines
756 B
TypeScript
26 lines
756 B
TypeScript
/** 敏感字段递归脱敏:命中的字段值替换为 ***(供请求体日志与审计参数复用)。 */
|
|
const SENSITIVE_KEYS = new Set([
|
|
'password',
|
|
'passwordhash',
|
|
'oldpassword',
|
|
'newpassword',
|
|
'confirmpassword',
|
|
'refreshtoken',
|
|
'token',
|
|
'secret',
|
|
'authorization',
|
|
]);
|
|
|
|
export function maskSensitive(value: unknown): unknown {
|
|
if (value === null || value === undefined) return value;
|
|
if (Array.isArray(value)) return value.map(maskSensitive);
|
|
if (typeof value === 'object') {
|
|
const out: Record<string, unknown> = {};
|
|
for (const [k, v] of Object.entries(value as Record<string, unknown>)) {
|
|
out[k] = SENSITIVE_KEYS.has(k.toLowerCase()) ? '***' : maskSensitive(v);
|
|
}
|
|
return out;
|
|
}
|
|
return value;
|
|
}
|