# 默认用户密码系统 **更新时间**: 2026-10-12 **状态**: ✅ 已实现动态密码系统 --- ## 🎯 目标 **消除硬编码的默认密码 `demo123`,实现每次安装时自动生成唯一密码** --- ## ✅ 实现内容 ### 1. 密码生成策略 **优先级顺序**: 1. **环境变量 `MOMENTRY_DEFAULT_PASSWORD`** (最高优先级) - 手动设置:`export MOMENTRY_DEFAULT_PASSWORD=my_secure_password` - 自动生成:`demo_` 2. **自动生成随机密码** (如果环境变量未设置) - 格式:`demo_<6位随机数>` - 示例:`demo_123456`, `demo_789012` --- ### 2. 修改的文件 #### `src-tauri/src/db.rs` **修改内容**: ```rust // 旧代码 (硬编码) let default_password = "demo123"; // 新代码 (动态密码) let default_password = std::env::var("MOMENTRY_DEFAULT_PASSWORD") .unwrap_or_else(|_| { use std::time::{SystemTime, UNIX_EPOCH}; let timestamp = SystemTime::now() .duration_since(UNIX_EPOCH) .unwrap() .as_secs(); format!("demo_{}", timestamp % 1000000) // demo_123456 }); ``` **新增功能**: - 首次创建用户时,打印默认密码到控制台 - 提示用户保存密码 --- #### `src-tauri/src/main.rs` **SMB 服务密码修改**: ```rust // 旧代码 (硬编码) format!("... --user demo:demo123 ...") // 新代码 (动态密码) let smb_user = std::env::var("SMB_USER").unwrap_or_else(|_| "demo".to_string()); let smb_password = std::env::var("SMB_PASSWORD") .or_else(|_| std::env::var("MOMENTRY_DEFAULT_PASSWORD")) .unwrap_or_else(|_| { // Fallback to a generated password use std::time::{SystemTime, UNIX_EPOCH}; let timestamp = SystemTime::now() .duration_since(UNIX_EPOCH) .unwrap() .as_secs(); format!("smb_{}", timestamp % 1000000) }); format!("... --user {}:{} ...", smb_user, smb_password) ``` --- ### 3. 新增工具 #### `src-tauri/src/bin/user_tool.rs` **用户管理命令行工具**: ```bash # 列出所有用户 ./user_tool list # 创建新用户 ./user_tool create # 修改用户密码 ./user_tool set-password # 删除用户 ./user_tool delete # 初始化 demo 用户 ./user_tool init-demo ``` **特点**: - 独立可执行文件,不依赖 Tauri 运行时 - 支持从环境变量读取默认密码 - 支持密码哈希(Argon2id) --- ### 4. 安装脚本更新 #### `install.sh` **新增步骤 5.5**: 初始化默认用户 ```bash # 生成安全随机密码 DEFAULT_PASSWORD="demo_$(openssl rand -hex 4)" # 设置环境变量 export MOMENTRY_DEFAULT_PASSWORD="${DEFAULT_PASSWORD}" # 保存到 .env 文件 echo "MOMENTRY_DEFAULT_PASSWORD=${DEFAULT_PASSWORD}" >> .env # 初始化数据库 ./src-tauri/target/release/user_tool init-demo ``` **输出示例**: ``` ======================================== Demo user initialized: Username: demo Password: demo_a1b2c3d4 ======================================== ``` --- ### 5. 配置文件更新 #### `.env.template` ```bash # ======================================== # 默认用户密码 # ======================================== # 在安装时自动生成,或手动设置 # 格式: demo_ MOMENTRY_DEFAULT_PASSWORD=demo_change_this # ======================================== # SMB 共享配置 # ======================================== SMB_USER=demo SMB_PASSWORD=${MOMENTRY_DEFAULT_PASSWORD} ``` --- ## 📊 架构对比 ### 旧架构 (硬编码) ``` 安装时 └─> 硬编码密码: demo123 └─> 所有安装使用相同密码 └─> 安全风险高 ❌ ``` --- ### 新架构 (动态密码) ``` 安装时 ├─> 检查环境变量 MOMENTRY_DEFAULT_PASSWORD │ ├─> 已设置 → 使用该值 │ └─> 未设置 → 生成随机密码 │ ├─> 保存到 .env 文件 │ └─> 初始化数据库 └─> 用户看到生成的密码 └─> 每次安装密码唯一 ✅ ``` --- ## 🔐 密码存储位置 ### SQLite 数据库 **路径**: `data/users/demo.sqlite` **表结构**: ```sql CREATE TABLE app_users ( id TEXT PRIMARY KEY, username TEXT NOT NULL UNIQUE, password_hash TEXT, -- Argon2id 哈希 display_name TEXT, role TEXT DEFAULT 'user', created_at TEXT, updated_at TEXT ); ``` **存储方式**: - 密码使用 Argon2id 算法哈希 - **不存储明文密码** - 哈希格式:`$argon2id$v=19$m=19456,t=2,p=1$...` --- ### .env 文件 **路径**: `momentry_studio/.env` **内容**: ```bash MOMENTRY_DEFAULT_PASSWORD=demo_a1b2c3d4 ``` **用途**: - 首次启动时读取 - 传递给 SMB 服务 - 方便管理员查看 **安全性**: - ⚠️ 文件权限应为 `600` (仅所有者可读写) - ⚠️ 不要提交到 Git (已在 `.gitignore`) --- ## 🚀 使用流程 ### 1. 自动安装 (推荐) ```bash # 运行安装脚本 ./install.sh # 输出示例: # ======================================== # Default user password: demo_a1b2c3d4 # Please save this password securely! # ======================================== ``` **脚本会自动**: - 生成随机密码 - 保存到 `.env` - 初始化数据库 - 打印密码给用户 --- ### 2. 手动设置密码 ```bash # 设置环境变量 export MOMENTRY_DEFAULT_PASSWORD=my_secure_password # 运行安装 ./install.sh # 或手动初始化 ./src-tauri/target/release/user_tool init-demo ``` --- ### 3. 查看用户列表 ```bash ./src-tauri/target/release/user_tool list # 输出: # Users: # ID Username Display Name Role # ------------------------------------------------------------ # demo demo Demo User admin ``` --- ### 4. 修改密码 ```bash ./src-tauri/target/release/user_tool set-password demo new_password_123 # 输出: # ✅ Password updated for user 'demo' ``` --- ### 5. 创建新用户 ```bash ./src-tauri/target/release/user_tool create admin secure_pass_456 # 输出: # ✅ User 'admin' created successfully ``` --- ## 📝 部署到新环境 ### m4promini 环境 ```bash # 1. 克隆代码 cd ~ git clone momentry_studio # 2. 运行安装 cd momentry_studio ./install.sh # 3. 记录生成的密码 (例如: demo_a1b2c3d4) # 4. 启动服务 ./start.sh ``` **系统会自动**: - 检测用户主目录:`/Users/nextorageai` - 创建数据目录:`~/momentry/var/sftpgo/data` - 生成唯一密码:`demo_` - 初始化 demo 用户 --- ## ⚠️ 安全注意事项 ### 1. 密码管理 ✅ **推荐做法**: - 使用强密码 (至少 12 位) - 定期更换密码 - 不同环境使用不同密码 - 将 `.env` 文件权限设为 `600` ❌ **不推荐做法**: - 使用硬编码密码 - 在代码中存储明文密码 - 多个环境共用相同密码 --- ### 2. 文件权限 ```bash # 设置 .env 文件权限 chmod 600 .env # 设置数据库文件权限 chmod 600 data/users/demo.sqlite ``` --- ### 3. 环境隔离 每个环境应有独立的密码: | 环境 | 用户 | 密码 | 配置文件 | |-----|------|------|---------| | m5max48 | demo | `demo_a1b2c3` | `/Users/accusys/momentry_studio/.env` | | m4promini | demo | `demo_x9y8z7` | `/Users/nextorageai/momentry_studio/.env` | | 生产环境 | demo | `demo_prod_...` | `/opt/momentry/.env` | --- ## 🛠️ 故障排除 ### 问题 1: 忘记密码 ```bash # 方法 1: 查看 .env 文件 cat .env | grep MOMENTRY_DEFAULT_PASSWORD # 方法 2: 重置密码 ./src-tauri/target/release/user_tool set-password demo new_password ``` --- ### 问题 2: 数据库初始化失败 ```bash # 检查数据库目录 ls -la data/users/ # 手动创建目录 mkdir -p data/users # 重新初始化 ./src-tauri/target/release/user_tool init-demo ``` --- ### 问题 3: SMB 服务无法连接 ```bash # 检查 SMB 密码配置 cat .env | grep SMB_PASSWORD # 确保密码一致 export SMB_PASSWORD=${MOMENTRY_DEFAULT_PASSWORD} # 重启 SMB 服务 ./src-tauri/target/release/momentry-studio # 或通过 GUI ``` --- ## 📊 检查清单 在部署前确认: - [ ] `.env` 文件已创建并包含 `MOMENTRY_DEFAULT_PASSWORD` - [ ] `.env` 文件权限为 `600` - [ ] 数据库文件已初始化 - [ ] demo 用户密码已记录 - [ ] SMB 密码已配置(如需 SMB 服务) - [ ] 不同环境使用不同密码 - [ ] `.env` 文件已添加到 `.gitignore` --- ## 🎉 总结 ### 改进前 - ❌ 硬编码密码 `demo123` - ❌ 所有安装使用相同密码 - ❌ 无法自定义密码 - ❌ 安全风险高 --- ### 改进后 - ✅ 动态生成唯一密码 - ✅ 每次安装密码独立 - ✅ 支持自定义密码 - ✅ 密码哈希存储 - ✅ 用户管理工具 - ✅ 安装自动化 --- **文档位置**: `docs/DEFAULT_PASSWORD_SYSTEM.md` **Commit**: 待提交 **Status**: ✅ 已实现动态密码系统