核心改动: 1. db.rs - 默认密码从环境变量读取或自动生成 - 优先级: MOMENTRY_DEFAULT_PASSWORD > 自动生成 - 格式: demo_<timestamp> 或自定义 - 首次创建时打印密码到控制台 2. main.rs - SMB 服务密码动态化 - 从 SMB_PASSWORD 或 MOMENTRY_DEFAULT_PASSWORD 读取 - 支持自定义 SMB 用户名 3. user_tool.rs - 新增用户管理工具 - list: 列出所有用户 - create: 创建新用户 - set-password: 修改密码 - delete: 删除用户 - init-demo: 初始化 demo 用户 4. install.sh - 安装时自动生成密码 - 生成随机密码: demo_$(openssl rand -hex 4) - 保存到 .env 文件 - 初始化数据库 5. .env.template - 新增密码配置 - MOMENTRY_DEFAULT_PASSWORD - SMB_USER / SMB_PASSWORD 安全改进: - 消除硬编码密码 'demo123' - 每次安装密码唯一 - 密码哈希存储 (Argon2id) - 支持自定义强密码 文档: - docs/DEFAULT_PASSWORD_SYSTEM.md 完整说明
8.7 KiB
8.7 KiB
默认用户密码系统
更新时间: 2026-10-12
状态: ✅ 已实现动态密码系统
🎯 目标
消除硬编码的默认密码 demo123,实现每次安装时自动生成唯一密码
✅ 实现内容
1. 密码生成策略
优先级顺序:
-
环境变量
MOMENTRY_DEFAULT_PASSWORD(最高优先级)- 手动设置:
export MOMENTRY_DEFAULT_PASSWORD=my_secure_password - 自动生成:
demo_<timestamp>
- 手动设置:
-
自动生成随机密码 (如果环境变量未设置)
- 格式:
demo_<6位随机数> - 示例:
demo_123456,demo_789012
- 格式:
2. 修改的文件
src-tauri/src/db.rs
修改内容:
// 旧代码 (硬编码)
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 服务密码修改:
// 旧代码 (硬编码)
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
用户管理命令行工具:
# 列出所有用户
./user_tool list
# 创建新用户
./user_tool create <username> <password>
# 修改用户密码
./user_tool set-password <username> <password>
# 删除用户
./user_tool delete <username>
# 初始化 demo 用户
./user_tool init-demo
特点:
- 独立可执行文件,不依赖 Tauri 运行时
- 支持从环境变量读取默认密码
- 支持密码哈希(Argon2id)
4. 安装脚本更新
install.sh
新增步骤 5.5: 初始化默认用户
# 生成安全随机密码
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
# ========================================
# 默认用户密码
# ========================================
# 在安装时自动生成,或手动设置
# 格式: demo_<random>
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
表结构:
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
内容:
MOMENTRY_DEFAULT_PASSWORD=demo_a1b2c3d4
用途:
- 首次启动时读取
- 传递给 SMB 服务
- 方便管理员查看
安全性:
- ⚠️ 文件权限应为
600(仅所有者可读写) - ⚠️ 不要提交到 Git (已在
.gitignore)
🚀 使用流程
1. 自动安装 (推荐)
# 运行安装脚本
./install.sh
# 输出示例:
# ========================================
# Default user password: demo_a1b2c3d4
# Please save this password securely!
# ========================================
脚本会自动:
- 生成随机密码
- 保存到
.env - 初始化数据库
- 打印密码给用户
2. 手动设置密码
# 设置环境变量
export MOMENTRY_DEFAULT_PASSWORD=my_secure_password
# 运行安装
./install.sh
# 或手动初始化
./src-tauri/target/release/user_tool init-demo
3. 查看用户列表
./src-tauri/target/release/user_tool list
# 输出:
# Users:
# ID Username Display Name Role
# ------------------------------------------------------------
# demo demo Demo User admin
4. 修改密码
./src-tauri/target/release/user_tool set-password demo new_password_123
# 输出:
# ✅ Password updated for user 'demo'
5. 创建新用户
./src-tauri/target/release/user_tool create admin secure_pass_456
# 输出:
# ✅ User 'admin' created successfully
📝 部署到新环境
m4promini 环境
# 1. 克隆代码
cd ~
git clone <repo_url> momentry_studio
# 2. 运行安装
cd momentry_studio
./install.sh
# 3. 记录生成的密码 (例如: demo_a1b2c3d4)
# 4. 启动服务
./start.sh
系统会自动:
- 检测用户主目录:
/Users/nextorageai - 创建数据目录:
~/momentry/var/sftpgo/data - 生成唯一密码:
demo_<random> - 初始化 demo 用户
⚠️ 安全注意事项
1. 密码管理
✅ 推荐做法:
- 使用强密码 (至少 12 位)
- 定期更换密码
- 不同环境使用不同密码
- 将
.env文件权限设为600
❌ 不推荐做法:
- 使用硬编码密码
- 在代码中存储明文密码
- 多个环境共用相同密码
2. 文件权限
# 设置 .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: 忘记密码
# 方法 1: 查看 .env 文件
cat .env | grep MOMENTRY_DEFAULT_PASSWORD
# 方法 2: 重置密码
./src-tauri/target/release/user_tool set-password demo new_password
问题 2: 数据库初始化失败
# 检查数据库目录
ls -la data/users/
# 手动创建目录
mkdir -p data/users
# 重新初始化
./src-tauri/target/release/user_tool init-demo
问题 3: SMB 服务无法连接
# 检查 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: ✅ 已实现动态密码系统