fix: DevTools 读取 .env 管理员凭据 + 统一 main.go 密码 fallback

两个问题导致用户无法用 .env 中的管理员账户登录:
1. DevTools 未读取 backend/.env,始终传 admin/cyrene-dev-admin 给 gateway
2. gateway main.go 中创建管理员时独立读取 os.Getenv 并以 "admin123"
   为 fallback,与 config.go 的 cfg.AdminPassword 不一致

修复:
- config.js: 启动时加载 backend/.env 到 process.env (不覆盖已有环境变量)
- main.go: 移除独立的 os.Getenv 读取,统一使用 cfg.AdminPassword

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-22 22:01:30 +08:00
parent 7c3b428257
commit 773f19f009
2 changed files with 24 additions and 5 deletions
+1 -5
View File
@@ -64,11 +64,7 @@ func main() {
log.Printf("⚠ 查询管理员用户失败: %v", err)
} else if existingAdmin == nil {
log.Printf("🔧 未找到管理员用户,创建默认 %s (username: %s)...", cfg.AdminUsername, cfg.AdminUsername)
// 优先使用环境变量 ADMIN_PASSWORD,否则回退到 "admin123"
defaultAdminPassword := os.Getenv("ADMIN_PASSWORD")
if defaultAdminPassword == "" {
defaultAdminPassword = "admin123"
}
defaultAdminPassword := cfg.AdminPassword
passwordHash, err := bcrypt.GenerateFromPassword([]byte(defaultAdminPassword), bcrypt.DefaultCost)
if err != nil {
log.Printf("⚠ 管理员密码哈希生成失败: %v", err)
+23
View File
@@ -14,6 +14,29 @@ const ROOT = path.resolve(__dirname, '../..');
const isWin = os.platform() === 'win32';
// 读取 backend/.env 文件,将值合并到 process.env(不覆盖已有的环境变量)
// 这样 DevTools 启动各服务时能传递用户配置的凭据
function loadEnvFile() {
const envPath = path.join(ROOT, 'backend', '.env');
try {
const content = fs.readFileSync(envPath, 'utf-8');
for (const line of content.split('\n')) {
const trimmed = line.trim();
if (!trimmed || trimmed.startsWith('#')) continue;
const eqIdx = trimmed.indexOf('=');
if (eqIdx === -1) continue;
const key = trimmed.substring(0, eqIdx).trim();
const val = trimmed.substring(eqIdx + 1).trim();
if (key && val !== undefined) {
process.env[key] = process.env[key] || val;
}
}
} catch {
// .env 文件不存在,使用默认值
}
}
loadEnvFile();
/** 跨平台 Go 二进制路径 */
function findGoBin() {
// 优先使用环境变量