|
|
# 用户权限系统使用指南
|
|
|
|
|
|
## 📋 系统概述
|
|
|
|
|
|
期货智析系统现已集成完整的用户权限管理系统,所有页面需要进行登录才能访问。系统支持两种用户角色:
|
|
|
|
|
|
- **管理员 (admin)**: 可以访问品种分析界面和系统管理界面
|
|
|
- **普通用户 (user)**: 只能访问品种分析界面
|
|
|
|
|
|
## 🔐 默认账户
|
|
|
|
|
|
系统首次启动时会自动创建默认管理员账户:
|
|
|
|
|
|
| 字段 | 值 |
|
|
|
|------|------|
|
|
|
| **用户名** | `lxy_root` |
|
|
|
| **密码** | `admin123` |
|
|
|
| **角色** | 管理员 (admin) |
|
|
|
| **邮箱** | `admin@system.local` |
|
|
|
|
|
|
⚠️ **重要**: 首次登录后请立即修改默认密码!
|
|
|
|
|
|
## 🚀 使用流程
|
|
|
|
|
|
### 1. 访问系统
|
|
|
|
|
|
打开浏览器访问:`http://localhost:9600`
|
|
|
|
|
|
系统会自动重定向到登录页面。
|
|
|
|
|
|
### 2. 登录
|
|
|
|
|
|
1. 输入用户名和密码
|
|
|
2. 点击"登录"按钮
|
|
|
3. 系统验证成功后会根据用户角色进行跳转
|
|
|
|
|
|
### 3. 角色跳转逻辑
|
|
|
|
|
|
#### 普通用户
|
|
|
- 登录后直接进入 **品种分析** 界面
|
|
|
- 访问地址:`http://localhost:9600/futures-analysis`
|
|
|
|
|
|
#### 管理员用户
|
|
|
- 登录后进入 **角色选择** 页面
|
|
|
- 可选择进入:
|
|
|
- **品种分析** - 智能期货分析工具
|
|
|
- **系统管理** - 后台管理配置界面
|
|
|
|
|
|
### 4. 退出登录
|
|
|
|
|
|
在任意页面点击"退出登录"按钮,或在角色选择页面点击退出。
|
|
|
|
|
|
## 📁 文件结构
|
|
|
|
|
|
```
|
|
|
app/
|
|
|
├── user_models.py # 用户数据库模型
|
|
|
├── auth_service.py # 认证服务(密码加密、会话管理)
|
|
|
├── api/
|
|
|
│ └── auth.py # 认证API路由
|
|
|
├── static/
|
|
|
│ ├── login.html # 登录页面
|
|
|
│ └── role_select.html # 角色选择页面
|
|
|
└── main.py # 主入口(已集成认证)
|
|
|
```
|
|
|
|
|
|
## 🔧 API接口
|
|
|
|
|
|
### 1. 用户登录
|
|
|
|
|
|
**POST** `/api/v1/auth/login`
|
|
|
|
|
|
**请求体:**
|
|
|
```json
|
|
|
{
|
|
|
"username": "lxy_root",
|
|
|
"password": "admin123"
|
|
|
}
|
|
|
```
|
|
|
|
|
|
**响应:**
|
|
|
```json
|
|
|
{
|
|
|
"success": true,
|
|
|
"token": "jr1xNX4egsLRStvVYLnkJj8uruB902VwCG4z3Wuy6dc",
|
|
|
"user": {
|
|
|
"id": 1,
|
|
|
"username": "lxy_root",
|
|
|
"role": "admin",
|
|
|
"email": "admin@system.local"
|
|
|
},
|
|
|
"message": "登录成功"
|
|
|
}
|
|
|
```
|
|
|
|
|
|
### 2. 验证令牌
|
|
|
|
|
|
**GET** `/api/v1/auth/verify`
|
|
|
|
|
|
**请求头:**
|
|
|
```
|
|
|
Authorization: Bearer <token>
|
|
|
```
|
|
|
|
|
|
**响应:**
|
|
|
```json
|
|
|
{
|
|
|
"success": true,
|
|
|
"user": {
|
|
|
"id": 1,
|
|
|
"username": "lxy_root",
|
|
|
"role": "admin",
|
|
|
"email": "admin@system.local",
|
|
|
"last_login": "2026-05-24T15:30:00"
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
### 3. 获取当前用户信息
|
|
|
|
|
|
**GET** `/api/v1/auth/me`
|
|
|
|
|
|
**请求头:**
|
|
|
```
|
|
|
Authorization: Bearer <token>
|
|
|
```
|
|
|
|
|
|
### 4. 用户登出
|
|
|
|
|
|
**POST** `/api/v1/auth/logout`
|
|
|
|
|
|
**请求头:**
|
|
|
```
|
|
|
Authorization: Bearer <token>
|
|
|
```
|
|
|
|
|
|
## 🗄️ 数据库表
|
|
|
|
|
|
系统创建了两个新表:
|
|
|
|
|
|
### 1. users 表 - 用户信息
|
|
|
|
|
|
| 字段 | 类型 | 说明 |
|
|
|
|------|------|------|
|
|
|
| id | INTEGER | 主键 |
|
|
|
| username | VARCHAR(50) | 用户名(唯一) |
|
|
|
| password_hash | VARCHAR(255) | 密码哈希 |
|
|
|
| email | VARCHAR(100) | 邮箱 |
|
|
|
| role | VARCHAR(20) | 角色 (admin/user) |
|
|
|
| is_active | BOOLEAN | 是否启用 |
|
|
|
| created_at | DATETIME | 创建时间 |
|
|
|
| last_login | DATETIME | 最后登录时间 |
|
|
|
|
|
|
### 2. sessions 表 - 会话管理
|
|
|
|
|
|
| 字段 | 类型 | 说明 |
|
|
|
|------|------|------|
|
|
|
| id | INTEGER | 主键 |
|
|
|
| user_id | INTEGER | 用户ID |
|
|
|
| token | VARCHAR(255) | 会话令牌(唯一) |
|
|
|
| created_at | DATETIME | 创建时间 |
|
|
|
| expires_at | DATETIME | 过期时间 |
|
|
|
| is_valid | BOOLEAN | 是否有效 |
|
|
|
|
|
|
## 🔒 安全特性
|
|
|
|
|
|
1. **密码加密**: 使用 SHA-256 + 随机盐值加密存储
|
|
|
2. **会话管理**: 使用安全令牌,24小时自动过期
|
|
|
3. **权限控制**: 基于角色的访问控制 (RBAC)
|
|
|
4. **自动清理**: 过期会话自动标记为无效
|
|
|
|
|
|
## 👥 用户管理
|
|
|
|
|
|
### 创建新用户
|
|
|
|
|
|
可以通过Python脚本或直接操作数据库创建用户:
|
|
|
|
|
|
```python
|
|
|
from app.database import SessionLocal
|
|
|
from app import auth_service
|
|
|
|
|
|
db = SessionLocal()
|
|
|
try:
|
|
|
auth_service.create_user(
|
|
|
db=db,
|
|
|
username='new_user',
|
|
|
password='secure_password',
|
|
|
email='user@example.com',
|
|
|
role='user' # 或 'admin'
|
|
|
)
|
|
|
finally:
|
|
|
db.close()
|
|
|
```
|
|
|
|
|
|
### 修改用户角色
|
|
|
|
|
|
```python
|
|
|
from app.database import SessionLocal
|
|
|
from app.user_models import User
|
|
|
|
|
|
db = SessionLocal()
|
|
|
try:
|
|
|
user = db.query(User).filter(User.username == 'username').first()
|
|
|
user.role = 'admin' # 或 'user'
|
|
|
db.commit()
|
|
|
finally:
|
|
|
db.close()
|
|
|
```
|
|
|
|
|
|
### 禁用用户
|
|
|
|
|
|
```python
|
|
|
user.is_active = False
|
|
|
db.commit()
|
|
|
```
|
|
|
|
|
|
## 🎯 页面访问控制
|
|
|
|
|
|
| 页面 | 需要登录 | 需要角色 |
|
|
|
|------|---------|---------|
|
|
|
| `/login` | ❌ | ❌ |
|
|
|
| `/futures-analysis` | ✅ | 任意 |
|
|
|
| `/role-select` | ✅ | admin |
|
|
|
| `/ui` | ✅ | admin |
|
|
|
| `/ai-config` | ✅ | 任意 |
|
|
|
| `/api/v1/*` | 部分接口 | 视接口而定 |
|
|
|
|
|
|
## 🐛 故障排查
|
|
|
|
|
|
### 1. 登录后无法访问页面
|
|
|
|
|
|
- 检查浏览器控制台是否有错误
|
|
|
- 确认localStorage中保存了auth_token
|
|
|
- 尝试清除浏览器缓存后重新登录
|
|
|
|
|
|
### 2. 令牌过期
|
|
|
|
|
|
- 会话令牌24小时过期
|
|
|
- 过期后需要重新登录
|
|
|
- 可在代码中修改 `expires_hours` 参数
|
|
|
|
|
|
### 3. 忘记管理员密码
|
|
|
|
|
|
可以通过数据库重置:
|
|
|
|
|
|
```python
|
|
|
from app.database import SessionLocal
|
|
|
from app import auth_service
|
|
|
|
|
|
db = SessionLocal()
|
|
|
try:
|
|
|
from app.user_models import User
|
|
|
admin = db.query(User).filter(User.username == 'lxy_root').first()
|
|
|
admin.password_hash = auth_service.hash_password('new_password')
|
|
|
db.commit()
|
|
|
print("密码已重置")
|
|
|
finally:
|
|
|
db.close()
|
|
|
```
|
|
|
|
|
|
## 📝 最佳实践
|
|
|
|
|
|
1. ✅ 首次登录后修改默认密码
|
|
|
2. ✅ 定期清理过期会话
|
|
|
3. ✅ 为不同用户分配最小权限原则
|
|
|
4. ✅ 定期检查用户登录日志
|
|
|
5. ✅ 备份用户数据库表
|
|
|
|
|
|
## 🔗 相关文档
|
|
|
|
|
|
- [部署指南](./DEPLOY.md)
|
|
|
- [系统架构](./DESIGN.md)
|
|
|
- [API文档](http://localhost:9600/docs)
|