Files
Lannamokia 990aeaa1e0 feat(auth): 实现管理员密码修改功能和安全增强
- 添加密码修改API端点,支持当前密码验证和新密码更新
- 将密码存储从环境变量迁移到数据库,使用bcrypt加密
- 新增admin_settings表用于存储密码哈希和系统设置
- 添加密码强度验证和错误处理逻辑
- 更新文档说明密码管理功能和默认凭据
2025-10-21 20:54:21 +08:00

549 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# VHD选择服务器 - 跨平台版本
一个现代化的跨平台VHD关键词管理服务器,提供Web GUI界面和HTTP API接口。
<img width="1280" height="1754" alt="image" src="https://github.com/user-attachments/assets/c1126381-d13e-4e88-a8da-99f86d778bef" />
## ✨ 特性
- 🌐 **跨平台支持**: 支持Windows、Linux、macOS
- 🎨 **现代化Web界面**: 响应式设计,支持移动设备
- 🔧 **RESTful API**: 标准HTTP API接口
- 💾 **持久化存储**: 自动保存配置到JSON文件
- 🚀 **零配置启动**: 开箱即用
- 📱 **实时更新**: 界面自动刷新状态
- 🔒 **输入验证**: 安全的用户输入处理
## 🛠️ 系统要求
### Node.js版本(推荐)
- Node.js 14.0+
- npm(随Node.js安装)
### Python版本(备选)
- Python 3.6+
- 无需额外依赖
## 🚀 快速开始
### 方法1: Docker部署(推荐)
#### 选项1: 使用内置数据库(默认)
```bash
# 使用Docker Compose启动(内置PostgreSQL数据库)
docker-compose up -d
# 查看日志
docker-compose logs -f
# 停止服务
docker-compose down
```
#### 选项2: 使用外部数据库
```bash
# 使用外部数据库配置文件
docker-compose -f docker-compose.external-db.yml up -d
# 或者手动配置环境变量
docker run -d \
--name vhd-select-server \
-p 8080:8080 \
-v $(pwd)/config:/app/config \
-v $(pwd)/vhd-data:/app/vhd-data \
-e USE_EMBEDDED_DB=false \
-e DB_HOST=your-db-host \
-e DB_PORT=5432 \
-e DB_NAME=vhd_select \
-e DB_USER=your-db-user \
-e DB_PASSWORD=your-db-password \
lty271104/vhd-select-server:latest
```
### 方法2: Node.js版本
1. **安装Node.js**
- 访问 [https://nodejs.org/](https://nodejs.org/)
- 下载并安装LTS版本
2. **启动服务器**
```bash
# 双击运行
start.bat
# 或者命令行运行
npm install
npm start
```
## 🌐 访问界面
服务器启动后,访问以下地址:
- **Web界面**: http://localhost:8080
- **API文档**: http://localhost:8080/api/status
## 📡 API接口
VHD Select Server 提供完整的RESTful API接口,支持机台管理、VHD关键词设置和状态监控。
### 🔐 认证接口
#### 登录
```http
POST /api/auth/login
Content-Type: application/json
{
"password": "admin123"
}
```
**响应示例**:
```json
{
"success": true,
"message": "登录成功"
}
```
#### 登出
```http
POST /api/auth/logout
```
**响应示例**:
```json
{
"success": true,
"message": "已登出"
}
```
#### 检查认证状态
```http
GET /api/auth/check
```
**响应示例**:
```json
{
"isAuthenticated": true
}
```
#### 修改管理员密码
```http
POST /api/auth/change-password
Content-Type: application/json
Authorization: 需要登录
{
"currentPassword": "admin123",
"newPassword": "newPassword123",
"confirmPassword": "newPassword123"
}
```
**响应示例**:
```json
{
"success": true,
"message": "密码修改成功"
}
```
**错误响应示例**:
```json
{
"success": false,
"message": "当前密码错误"
}
```
### 🖥️ VHD关键词接口
#### 获取当前VHD关键词
```http
GET /api/boot-image-select?machineId=MACHINE001
```
**参数说明**:
- `machineId` (必需): 机台唯一标识符
**响应示例**:
```json
{
"success": true,
"BootImageSelected": "SDEZ",
"machineId": "MACHINE001",
"timestamp": "2025-10-21T11:39:43.809Z"
}
```
#### 设置全局VHD关键词 🔒
```http
POST /api/set-vhd
Content-Type: application/json
Authorization: 需要登录
{
"BootImageSelected": "NEW_KEYWORD"
}
```
**响应示例**:
```json
{
"success": true,
"BootImageSelected": "NEW_KEYWORD",
"message": "VHD关键词更新成功"
}
```
### 🛡️ 机台保护接口
#### 获取机台保护状态
```http
GET /api/protect?machineId=MACHINE001
```
**参数说明**:
- `machineId` (必需): 机台唯一标识符
**响应示例**:
```json
{
"success": true,
"protected": false,
"machineId": "MACHINE001",
"timestamp": "2025-10-21T11:39:43.809Z"
}
```
#### 设置机台保护状态 🔒
```http
POST /api/protect
Content-Type: application/json
Authorization: 需要登录
{
"machineId": "MACHINE001",
"protected": true
}
```
**响应示例**:
```json
{
"success": true,
"protected": true,
"machineId": "MACHINE001",
"message": "机台保护状态已更新"
}
```
### 🏭 机台管理接口
#### 获取所有机台信息 🔒
```http
GET /api/machines
Authorization: 需要登录
```
**响应示例**:
```json
{
"success": true,
"machines": [
{
"machine_id": "MACHINE001",
"protected": false,
"vhd_keyword": "SDEZ",
"last_seen": "2025-10-21T11:39:43.809Z",
"created_at": "2025-10-21T10:00:00.000Z"
}
],
"count": 1,
"timestamp": "2025-10-21T11:39:43.809Z"
}
```
#### 设置特定机台的VHD关键词 🔒
```http
POST /api/machines/{machineId}/vhd
Content-Type: application/json
Authorization: 需要登录
{
"vhdKeyword": "CUSTOM_VHD"
}
```
**响应示例**:
```json
{
"success": true,
"machineId": "MACHINE001",
"vhdKeyword": "CUSTOM_VHD",
"message": "机台VHD关键词已更新"
}
```
#### 删除机台 🔒
```http
DELETE /api/machines/{machineId}
Authorization: 需要登录
```
**响应示例**:
```json
{
"success": true,
"machineId": "MACHINE001",
"message": "机台已删除"
}
```
### 📊 系统状态接口
#### 获取服务器状态
```http
GET /api/status
```
**响应示例**:
```json
{
"success": true,
"status": "running",
"BootImageSelected": "SDEZ",
"uptime": 30.415774368,
"timestamp": "2025-10-21T11:39:43.809Z",
"version": "1.2.0"
}
```
### 📝 API使用说明
**认证要求**:
- 🔒 标记的接口需要先通过 `/api/auth/login` 登录
- 登录后会话有效期为24小时
- 默认管理员密码: `admin123`
**错误响应格式**:
```json
{
"success": false,
"error": "错误描述",
"requireAuth": true // 仅在需要认证时出现
}
```
**状态码说明**:
- `200`: 请求成功
- `400`: 请求参数错误
- `401`: 未认证或认证失败
- `404`: 资源不存在
- `500`: 服务器内部错误
## 🎯 使用说明
### Web界面操作
1. **查看当前状态**: 页面会显示服务器运行状态和当前VHD关键词
2. **设置新关键词**: 在输入框中输入新的VHD关键词,点击"更新"按钮
3. **自动刷新**: 页面每30秒自动刷新状态
4. **实时反馈**: 操作结果会立即显示在界面上
### 配置持久化
- **Docker部署**: 配置保存在 `/app/config/vhd-config.json`,通过卷映射到主机的 `./config` 目录
- **本地部署**: 配置保存在项目根目录的 `vhd-config.json` 文件中
- **环境变量**: 可通过 `CONFIG_PATH` 环境变量自定义配置文件路径
### Docker相关
#### 数据库配置选项
**内置数据库模式(默认)**
- 自动在容器内启动PostgreSQL数据库
- 数据持久化到Docker卷
- 零配置,开箱即用
**外部数据库模式**
- 连接到外部PostgreSQL数据库
- 支持云数据库服务
- 更好的扩展性和可维护性
#### 环境变量
**应用配置**
- `PORT`: 服务端口(默认: 8080)
- `CONFIG_PATH`: 配置文件目录路径(默认: /app/config)
- `NODE_ENV`: 运行环境(默认: production)
**数据库配置**
- `USE_EMBEDDED_DB`: 是否使用内置数据库(默认: true)
- `DB_HOST`: 数据库主机地址(默认: localhost)
- `DB_PORT`: 数据库端口(默认: 5432)
- `DB_NAME`: 数据库名称(默认: vhd_select)
- `DB_USER`: 数据库用户名(默认: postgres)
- `DB_PASSWORD`: 数据库密码(默认: vhd_select_password)
- `DB_MAX_CONNECTIONS`: 最大连接数(默认: 20)
- `DB_IDLE_TIMEOUT`: 空闲连接超时时间(默认: 30000ms)
- `DB_CONNECTION_TIMEOUT`: 连接超时时间(默认: 5000ms)
- `DB_SSL`: 是否启用SSL连接(默认: false)
#### 数据卷
- `/app/config`: 配置文件持久化目录
- `/app/vhd-data`: VHD数据文件持久化目录
- `/var/lib/postgresql/data`: 内置数据库数据持久化目录
#### 健康检查
- 端点: `http://localhost:8080/api/health`
- 间隔: 30秒
- 超时: 10秒
- 重试: 3次
- 启动等待时间: 60秒
#### 配置文件说明
**docker-compose.yml**: 使用内置数据库的默认配置
**docker-compose.external-db.yml**: 使用外部数据库的示例配置
#### 故障排除
**内置数据库问题**
```bash
# 检查数据库初始化日志
docker-compose logs vhd-select-server | grep -i postgres
# 重新初始化数据库
docker-compose down -v
docker-compose up -d
```
**外部数据库连接问题**
```bash
# 测试数据库连接
docker run --rm -it postgres:15-alpine psql -h your-db-host -U your-db-user -d vhd_select
# 检查网络连接
docker-compose exec vhd-select-server ping your-db-host
```
**数据持久化问题**
```bash
# 检查数据卷
docker volume ls | grep vhd
# 备份数据
docker run --rm -v vhd_db_data:/data -v $(pwd):/backup alpine tar czf /backup/vhd_backup.tar.gz /data
```
### 命令行测试
```bash
# 获取当前VHD关键词
curl http://localhost:8080/api/boot-image-select
# 设置新的VHD关键词
curl -X POST http://localhost:8080/api/set-vhd \
-H "Content-Type: application/json" \
-d '{"BootImageSelected":"CUSTOM_VHD"}'
```
## 📁 文件结构
```
VHDSelectServer/
├── server.js # Node.js服务器
├── server.py # Python服务器
├── package.json # Node.js依赖配置
├── start.bat # Windows启动脚本
├── public/
│ └── index.html # Web界面
├── vhd-config.json # 配置文件(自动生成)
└── README.md # 说明文档
```
## 🔧 配置说明
- **端口**: 默认8080,可通过环境变量`PORT`修改
- **配置文件**: `vhd-config.json`自动生成,存储当前VHD关键词
- **日志**: 服务器会在控制台输出访问日志
## 🔗 与VHD挂载程序集成
此服务器与原有的VHD挂载程序完全兼容:
1. **API兼容**: 保持原有的`/api/boot-image-select`接口
2. **数据格式**: 返回相同的JSON格式
3. **配置持久化**: VHD关键词会自动保存和恢复
## 🛡️ 安全特性
- **输入验证**: 自动验证和清理用户输入
- **CORS支持**: 支持跨域请求
- **错误处理**: 完善的错误处理和用户反馈
- **格式标准化**: 自动转换为大写格式
- **用户认证**: 基于会话的管理员认证系统
- **密码安全**: bcrypt加密存储,支持在线修改管理员密码
- **会话管理**: 24小时会话有效期,自动登出保护
- **数据库安全**: 密码哈希持久化存储,支持密码策略验证
## 🐛 故障排除
### 端口被占用
```bash
# 检查端口占用
netstat -ano | findstr :8080
# 使用其他端口
python server.py 8081
```
### Node.js未安装
- 下载安装: https://nodejs.org/
- 使用Python版本作为备选方案
### 权限问题
- 确保有写入配置文件的权限
- 在管理员模式下运行(如需要)
## 📝 更新日志
### v1.2.0
- ✅ 完整Docker化支持(内置/外部数据库)
- ✅ PostgreSQL数据库集成
- ✅ 机台管理功能
- ✅ 机台保护状态控制
- ✅ 用户认证和会话管理
- ✅ 管理员密码在线修改功能
- ✅ bcrypt密码加密存储
- ✅ 密码安全策略验证
- ✅ 完整的RESTful API文档
- ✅ 健康检查和监控
- ✅ 数据持久化和备份
### v1.0.0
- ✅ 跨平台支持(Node.js + Python)
- ✅ 现代化Web界面
- ✅ RESTful API接口
- ✅ 用户自定义VHD关键词
- ✅ 配置持久化存储
- ✅ 实时状态更新
## 🤝 技术支持
如有问题,请检查:
1. 服务器是否正常启动
2. 端口是否被占用
3. 防火墙设置
4. 浏览器控制台错误信息
---
**🎉 享受使用全新的跨平台VHD选择服务器!**