You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
buffer_platform/AUTH_GUIDE.md

274 lines
5.8 KiB

# 用户权限系统使用指南
## 📋 系统概述
期货智析系统现已集成完整的用户权限管理系统,所有页面需要进行登录才能访问。系统支持两种用户角色:
- **管理员 (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)