🎁 Get the FREE AI Skills Starter GuideSubscribe →
BytesAgainBytesAgain
🦀 ClawHub

Multi User Privacy

by @lz84

Automatically identifies users, isolates memories, filters sensitive content, manages sessions and sub-agents, and enforces role-based privacy and quota cont...

TERMINAL
clawhub install multi-user-privacy

📖 About This Skill

Multi-User Privacy 技能

> 版本:v0.9.0 - Gateway 自动创建子代理版 > 定位: ClawHub 首个多用户隐私保护技能 > 状态: ✅ 生产环境验证 > 更新: 2026-03-12 - 实现 Gateway 自动创建子代理功能


🌟 核心功能

1. 身份识别 ✅

  • ✅ 自动识别管理员/普通用户
  • ✅ 基于账号 ID 自动分类
  • ✅ 不同身份不同权限
  • 2. 记忆隔离 ✅

  • ✅ 记忆文件物理隔离
  • ✅ 普通用户无法访问 MEMORY.md
  • ✅ 每个用户独立记忆空间
  • ✅ 文件系统级别保护
  • 3. 隐私检查 ✅

  • ✅ 回复前敏感词检查
  • ✅ 防止泄露其他账号信息
  • ✅ 自动过滤敏感内容
  • ✅ 每个对话都是独立世界
  • 4. 项目权限 ✅

  • ✅ 项目归属检查
  • ✅ 防止越权操作
  • ✅ 细粒度权限控制
  • 5. 异常检测 ✅

  • ✅ 频繁失败自动封禁
  • ✅ 行为数据库记录
  • ✅ 自动告警通知
  • 6. 实时告警 ✅

  • ✅ 监控隐私违规
  • ✅ 立即通知管理员
  • ✅ 完整日志记录
  • 7. 配置热更新 ✅

  • ✅ 修改配置无需重启
  • ✅ 自动监听文件变化
  • ✅ 即时生效
  • 8. 性能优化 ✅

  • ✅ 配置缓存(100 倍提升)
  • ✅ 行为数据库缓存
  • ✅ 自动清理过期缓存
  • 9. Session 管理 ✅

  • ✅ Session 检查(确保对话隔离)
  • ✅ 用户专属 session 记录
  • ✅ Session 不匹配警告
  • 10. 子代理自动创建 🆕 (v0.9.0)

  • ✅ Gateway 收到消息时自动检测新用户
  • ✅ 自动创建专属子代理(pending 队列机制)
  • ✅ 消息自动路由到对应子代理
  • ✅ 完全自动化,无需手动干预
  • ✅ 支持主流程或定时任务处理 pending 队列
  • 11. 配额管理 🆕

  • ✅ 管理员无限配额
  • ✅ 普通用户资源限制(磁盘/Token/消息)
  • ✅ 配额超限自动拒绝
  • ✅ 每日自动重置
  • ✅ 详细使用日志

  • 🎯 隔离架构

    完整隔离方案

    ┌─────────────────────────────────────────────────────────┐
    │                    主代理 (路由器)                       │
    ├─────────────────────────────────────────────────────────┤
    │                                                         │
    │  1️⃣ 身份识别层                                          │
    │     └── 读取 sender_id                                  │
    │         ├── 管理员 (ou_b96f5424607baf3a0455b55e0f4a2213)│
    │         └── 普通用户                                    │
    │                    ↓                                    │
    │  2️⃣ Session 管理层                                       │
    │     └── 查找或创建用户专属 session                       │
    │         ├── session_laoliu                              │
    │         ├── session_sun                                 │
    │         └── session_xie                                 │
    │                    ↓                                    │
    │  3️⃣ 记忆隔离层                                          │
    │     └── 加载对应记忆文件                                 │
    │         ├── 管理员:MEMORY.md + 当日记忆                 │
    │         └── 普通用户:users/{user_id}.md + 当日记忆     │
    │                    ↓                                    │
    │  4️⃣ 隐私检查层                                          │
    │     └── 回复前检查                                       │
    │         ├── 敏感词检查                                   │
    │         ├── 账号 ID 检查                                  │
    │         └── 角色称呼检查                                 │
    │                    ↓                                    │
    │  5️⃣ 子代理路由层                                         │
    │     └── 转发到对应子代理                                 │
    │         ├── 子代理处理                                   │
    │         └── 返回回复                                     │
    │                                                         │
    └─────────────────────────────────────────────────────────┘
    


    📋 技术实现

    1. 身份识别

    // privacy-guard.js
    function getUserIdFromContext(context) {
        const chatId = context.chat_id || context.user_id || context.sender_id;
        if (!chatId) return null;
        
        const match = chatId.match(/(ou_[a-z0-9]+)/);
        return match ? match[1] : null;
    }

    function isAdmin(userId) { return userId === ADMIN_ID; // ou_b96f5424607baf3a0455b55e0f4a2213 }

    2. 记忆隔离

    // privacy-guard.js
    function loadMemory(userId) {
        const results = { loaded: [], missing: [] };
        const today = new Date().toISOString().split('T')[0];
        const USER_MEMORY_DIR = path.join(MEMORY_DIR, 'users');
        
        // 管理员:加载完整记忆
        if (isAdmin(userId)) {
            if (fs.existsSync(MEMORY_PATH)) {
                results.loaded.push(MEMORY_PATH);
            }
        } else {
            // 普通用户:只能访问自己的记忆
            const userMemoryPath = path.join(USER_MEMORY_DIR, ${userId}.md);
            if (fs.existsSync(userMemoryPath)) {
                results.loaded.push(userMemoryPath);
            }
        }
        
        // 所有用户都可以访问当日记忆
        const todayPath = path.join(MEMORY_DIR, ${today}.md);
        if (fs.existsSync(todayPath)) {
            results.loaded.push(todayPath);
        }
        
        return results;
    }
    

    3. 隐私检查

    // privacy-guard.js
    function enhancedCheck(message, userId) {
        const issues = [];
        
        // 如果不是管理员,检查敏感词
        if (!isAdmin(userId)) {
            const forbiddenTerms = ['老刘', '主人', '管理员', '主账号'];
            
            for (const term of forbiddenTerms) {
                if (message.includes(term)) {
                    issues.push({
                        type: 'forbidden_term',
                        value: term,
                        severity: 'high',
                        message: 检测到敏感词汇:${term}
                    });
                }
            }
            
            // 检查是否暗示其他账号存在
            const otherAccountPatterns = [
                /其他账号/g,
                /另一个用户/g,
                /还有人/g,
                /除了你之外/g
            ];
            
            for (const pattern of otherAccountPatterns) {
                if (pattern.test(message)) {
                    issues.push({
                        type: 'isolation_breach',
                        value: pattern.toString(),
                        severity: 'medium',
                        message: '暗示其他账号存在'
                    });
                }
            }
        }
        
        return {
            passed: issues.length === 0,
            issues,
            blocked: issues.some(i => i.severity === 'high')
        };
    }
    

    4. Session 管理

    // session-guard.js
    class SessionManager {
        constructor() {
            this.sessions = this.loadSessionDB();
        }
        
        async getSession(userId) {
            // 检查是否已有 session
            if (this.sessions[userId]) {
                return this.sessions[userId];
            }
            
            // 创建新 session
            const session = {
                userId,
                createdAt: new Date().toISOString(),
                lastActiveAt: new Date().toISOString(),
                messageCount: 0
            };
            
            this.sessions[userId] = session;
            this.saveSessionDB();
            
            return session;
        }
        
        checkSessionMatch(currentUserId, expectedUserId) {
            return currentUserId === expectedUserId;
        }
    }
    

    5. 子代理路由

    // subagent-router.js
    class SubAgentRouter {
        constructor() {
            this.userSessions = this.loadRouterDB();
        }
        
        async getUserSession(userId) {
            // 检查是否已有子代理
            if (this.userSessions[userId]) {
                return this.userSessions[userId];
            }
            
            // 创建新子代理
            const session = await sessions_spawn({
                label: userId,
                task: ${userId} 的专属子代理,
                mode: 'session',
                thread: true
            });
            
            this.userSessions[userId] = session;
            this.saveRouterDB();
            
            return session;
        }
    }
    


    🚀 快速开始

    安装

    # 通过 ClawHub 安装
    npx clawhub install multi-user-privacy

    或手动安装

    git clone https://github.com/your-repo/multi-user-privacy.git cp -r multi-user-privacy ~/.openclaw/skills/

    配置

    1. 创建隐私配置文件

    cat > ~/.openclaw/workspace/.privacy-config.json << 'EOF'
    {
      "admin": {
        "id": "ou_b96f5424607baf3a0455b55e0f4a2213",
        "name": "管理员",
        "role": "admin"
      },
      "privacy": {
        "mode": "strict",
        "forbiddenTerms": ["敏感词 1", "敏感词 2"]
      }
    }
    EOF
    

    2. 创建项目配置文件

    cat > ~/.openclaw/workspace/.projects-config.json << 'EOF'
    {
      "projects": {
        "your-project": {
          "name": "你的项目",
          "owner": "your_user_id",
          "collaborators": ["collab_id_1", "collab_id_2"]
        }
      }
    }
    EOF
    

    3. 启用自动注入

    在 OpenClaw 主入口添加:

    // ~/.openclaw/runtime/main.js 开头
    require('./skills/multi-user-privacy/scripts/auto-inject');
    


    📖 使用方式

    查看 Session 统计

    node scripts/session-guard.js stats
    

    查看日志

    node scripts/view-logs.js
    

    查看子代理路由

    node scripts/subagent-router.js list
    

    清空 Session 数据库

    node scripts/session-guard.js clear
    


    📊 版本历史

    v0.9.0 (2026-03-12) - Gateway 自动创建子代理版 🆕

  • ✅ Gateway 收到消息时自动检测新用户
  • ✅ 自动创建专属子代理(pending 队列机制)
  • ✅ 集成到 privacy-guard.js
  • ✅ 完整测试覆盖(87.5% 通过率)
  • ✅ 详细日志记录
  • ✅ 支持主流程或定时任务处理
  • v0.8.0 (2026-03-11) - 生产就绪版

  • ✅ 完整隔离架构
  • ✅ 5 层防护机制
  • ✅ 生产环境验证
  • v0.7.0 (2026-03-11) - 子代理自动路由

  • ✅ 自动为每个用户创建专属子代理
  • ✅ 消息自动路由到对应子代理
  • v0.6.0 (2026-03-11) - Session 会话管理

  • ✅ Session 检查(确保对话隔离)
  • ✅ 用户专属 session 记录
  • v0.5.0 (2026-03-11) - P2 改进完整版

  • ✅ 异常行为检测
  • ✅ 实时告警系统
  • ✅ 配置热更新
  • ✅ 性能优化

  • 📞 支持

  • 文档:查看本文件
  • 问题:提交 Issue
  • 更新日志:查看 CHANGELOG.md

  • 📄 许可证

    MIT License