docs: 确认用户数据库隔离问题

问题发现:
- Momentry Studio 硬编码 demo.sqlite
- 违反'一用户一数据库'设计原则
- 所有用户共享同一数据库

检查结果:
- Momentry Studio: 只有 1 个 demo.sqlite ❌
- MarkBase Core: 3 个用户数据库 ✅

修复方案:
1. 方案 1: 函数参数传递 (推荐)
   - db_path(username) 动态生成路径
   - 所有数据库函数添加 username 参数

2. 方案 2: 环境变量 (折中)
   - MOMENTRY_CURRENT_USER 环境变量
   - db_path() 读取环境变量

3. 方案 3: 全局状态 (Tauri State)
   - 线程安全的状态管理
   - 集中管理用户状态

受影响功能:
- 搜索历史
- 书签
- 视频标记
- 用户认证 (例外,保持共享)

工作量: 2-3 天
优先级: 高 (影响数据隔离)

文档:
- docs/USER_DATABASE_ISOLATION_FIX.md - 详细修复方案
- scripts/check_user_isolation.sh - 检查脚本
This commit is contained in:
2026-10-12 14:50:34 +08:00
parent 88151b2666
commit 08584ecc87
2 changed files with 534 additions and 0 deletions

126
scripts/check_user_isolation.sh Executable file
View File

@@ -0,0 +1,126 @@
#!/bin/bash
# 用户数据库隔离检查脚本
echo "================================================================================
用户数据库隔离检查
================================================================================
"
USER_HOME=$(eval echo ~${SUDO_USER:-$USER})
echo "1. 检查数据库文件"
echo "--------------------------------------------------------------------------------"
# 检查 Momentry Studio 数据库
STUDIO_DB_DIR="/Users/accusys/momentry_studio/data/users"
if [ -d "$STUDIO_DB_DIR" ]; then
echo "Momentry Studio 数据库目录:"
ls -lh "$STUDIO_DB_DIR"/*.sqlite 2>/dev/null || echo " ❌ 无数据库文件"
echo ""
echo "数据库数量: $(ls "$STUDIO_DB_DIR"/*.sqlite 2>/dev/null | wc -l | tr -d ' ')"
# 检查是否只有一个 demo.sqlite
if [ -f "$STUDIO_DB_DIR/demo.sqlite" ] && [ $(ls "$STUDIO_DB_DIR"/*.sqlite 2>/dev/null | wc -l) -eq 1 ]; then
echo " ⚠️ 只有 demo.sqlite,违反'一用户一数据库'原则"
fi
else
echo "❌ Momentry Studio 数据库目录不存在"
fi
echo ""
# 检查 MarkBase 数据库
MARKBASE_DB_DIR="${USER_HOME}/markbase/data/users"
if [ -d "$MARKBASE_DB_DIR" ]; then
echo "MarkBase 数据库目录:"
ls -lh "$MARKBASE_DB_DIR"/*.sqlite 2>/dev/null
echo ""
echo "数据库数量: $(ls "$MARKBASE_DB_DIR"/*.sqlite 2>/dev/null | wc -l | tr -d ' ')"
echo " ✅ 多个用户数据库,符合'一用户一数据库'原则"
else
echo "❌ MarkBase 数据库目录不存在"
fi
echo ""
echo "2. 检查代码实现"
echo "--------------------------------------------------------------------------------"
# 检查 db.rs 中的 db_path 函数
if grep -q 'join("demo.sqlite")' /Users/accusys/momentry_studio/src-tauri/src/db.rs 2>/dev/null; then
echo "❌ db.rs 硬编码 demo.sqlite:"
grep -n 'join("demo.sqlite")' /Users/accusys/momentry_studio/src-tauri/src/db.rs
echo ""
echo " 违反了'一用户一数据库'原则"
else
echo "✅ db.rs 实现动态用户数据库路径"
fi
echo ""
echo "3. 检查当前登录用户"
echo "--------------------------------------------------------------------------------"
# 从 localStorage 获取当前用户(需要前端运行)
if pgrep -f "momentry-studio\|momentry-proxy" >/dev/null 2>&1; then
echo "应用正在运行"
echo " ⚠️ 无法直接检查 localStorage,需要手动验证"
echo " 建议: 检查前端 localStorage.getItem('username')"
else
echo "应用未运行"
fi
echo ""
echo "================================================================================
问题总结
================================================================================
"
echo "当前状态:"
echo ""
echo "Momentry Studio:"
if [ -f "$STUDIO_DB_DIR/demo.sqlite" ] && [ $(ls "$STUDIO_DB_DIR"/*.sqlite 2>/dev/null | wc -l) -eq 1 ]; then
echo " ❌ 只有 demo.sqlite (硬编码)"
echo " ❌ 所有用户共享同一数据库"
echo " ❌ 违反'一用户一数据库'原则"
else
echo " ✅ 多个用户数据库"
echo " ✅ 符合设计原则"
fi
echo ""
echo "MarkBase Core:"
if [ -d "$MARKBASE_DB_DIR" ] && [ $(ls "$MARKBASE_DB_DIR"/*.sqlite 2>/dev/null | wc -l) -gt 1 ]; then
echo " ✅ 多个用户数据库"
echo " ✅ 符合'一用户一数据库'原则"
else
echo " ⚠️ 数据库数量不足"
fi
echo ""
echo "================================================================================
修复建议
================================================================================
"
if [ -f "$STUDIO_DB_DIR/demo.sqlite" ] && [ $(ls "$STUDIO_DB_DIR"/*.sqlite 2>/dev/null | wc -l) -eq 1 ]; then
echo "需要修复:"
echo "1. 修改 db.rs 的 db_path() 函数"
echo " - 支持动态用户名"
echo " - 从环境变量或函数参数获取"
echo ""
echo "2. 修改所有数据库函数"
echo " - 添加 username 参数"
echo " - 或使用环境变量"
echo ""
echo "3. 修改前端调用"
echo " - 传递当前用户名"
echo ""
echo "详见: docs/USER_DATABASE_ISOLATION_FIX.md"
else
echo "✅ 当前实现符合设计原则"
fi
echo ""
echo "================================================================================
"