Skip to content

Commit 0dbbbd1

Browse files
committed
feat: add self-service user registration with configurable approval workflow
1 parent d894692 commit 0dbbbd1

23 files changed

Lines changed: 1168 additions & 59 deletions

.ostool-server.dev.toml

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,20 @@ board_dir = "/home/zcs/WORKSPACE/ostool/.ostool-server/boards"
44
dtb_dir = "/home/zcs/WORKSPACE/ostool/.ostool-server/dtbs"
55

66
[database]
7-
# provider = "sqlite"
8-
# url = "sqlite:/home/zcs/WORKSPACE/ostool/.ostool-server/ostool.db"
97
provider = "mysql"
108
url = "mysql://ostool:Ostool%402026Strong%21@127.0.0.1:3306/ostool"
119

10+
[sample_data]
11+
enabled = true
12+
13+
[sample_data.admin]
14+
enabled = true
15+
username = "admin"
16+
password = "ostool123"
17+
reset_existing_password = true
18+
display_name = "平台管理员"
19+
email = "admin@ostool.local"
20+
1221
[tftp]
1322
provider = "builtin"
1423
enabled = false
@@ -24,14 +33,3 @@ interface = "lo"
2433

2534
[upload_limits]
2635
session_file_max_mib = 64
27-
28-
[sample_data]
29-
enabled = true
30-
31-
[sample_data.admin]
32-
enabled = true
33-
username = "admin"
34-
password = "ostool123"
35-
reset_existing_password = true
36-
display_name = "平台管理员"
37-
email = "admin@ostool.local"
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
# 开发板管理租赁平台 · 功能需求
2+
3+
> 项目:**ostool-server** · 版本 v1.0
4+
5+
---
6+
7+
## 1. 角色与权限
8+
9+
- **匿名访客**:浏览公开资源、文档、条款。
10+
- **普通用户**:申请租赁、使用会话、上传镜像、串口调试。
11+
- **管理员**:管理库存、用户、角色、电源、TFTP、服务器配置。
12+
- **RBAC**`roles` / `permissions` / `user_roles` / `role_permissions`,权限按模块分组。
13+
- **账号开通**:支持自助注册 + 管理员开通两种途径;密码 ≥ 8 位;支持禁用、重置。
14+
- **注册策略**(站点设置可配置):
15+
- **关闭注册**:仅管理员可开通账号。
16+
- **自动生效**:注册成功立即激活,可登录。
17+
- **管理员审核**:注册后进入待审核状态,管理员审核通过后激活;用户可在注册页与登录页看到审核状态提示。
18+
- **审核工作流**:管理员后台「待审核用户」列表,支持批量/单个通过、拒绝、补充备注,并通知用户。
19+
- **防滥用**:注册需验证码(图形验证码 / 邮箱验证码,按策略启用);同一邮箱/IP 限频。
20+
21+
---
22+
23+
## 2. 公共页面
24+
25+
- 首页、资源总览、文档、服务条款、隐私政策。
26+
- 资源页:板型列表、在管/可用数、标签、搜索/过滤/排序、卡片与列表视图、空闲容量条。
27+
28+
---
29+
30+
## 3. 用户工作台
31+
32+
- **总览**:活跃租约数、会话数、快捷入口。
33+
- **账户**:资料展示、修改密码。
34+
- **我的租赁**:日历视图(时/日/月/年)、创建/释放/续租、列表与网格切换。
35+
- **租约会话**:会话列表、进入会话详情(串口、文件、上下电)。
36+
- **会话申请**:选板型、选时段(冲突高亮)、自动分配空闲板、返回会话 ID 与租约过期时间。
37+
38+
---
39+
40+
## 4. 会话与会话作用域
41+
42+
- **生命周期**:创建 → 已分配 → 运行中(心跳续租)→ 释放 / 过期 / 强制结束;结束自动回收板与清理临时文件。
43+
- **会话能力**(以 session_id 隔离):
44+
- WebSocket 串口通道
45+
- 会话文件上传/下载/删除(内核、ramfs、DTB)
46+
- TFTP 文件、UEFI HTTP Boot 镜像、boot profile
47+
- 电源控制与状态查询
48+
- **启动模式**(按板型三选一):
49+
- U-Boot + TFTP:`kernel_load_addr` / `fit_load_addr` / `bootm_addr` / `dtb_name` / `network_mode`
50+
- PXE
51+
- UEFI HTTP Boot:`boot_arch`、axloader,复用会话级存储
52+
- 平台根据板型自动生成 bootcmd、加载地址、网络配置。
53+
54+
---
55+
56+
## 5. 管理后台
57+
58+
- **总览**:开发板/会话/用户/角色等关键指标与最近活动。
59+
- **用户**:CRUD、角色分配、重置密码、禁用/启用;待审核用户列表(通过/拒绝/备注)。
60+
- **角色与权限**:角色 CRUD、权限绑定、禁用。
61+
- **开发板库存**`board_configs` 为唯一权威源;字段含基础信息、串口(端口键/波特率)、电源管理、启动配置;运行态查询;串口端口与网卡探测。
62+
- **租约**:全用户列表、代申请、改期、释放、强制结束、启停会话。
63+
- **会话**:全平台列表、关闭/删除、上下文查看。
64+
- **DTB**:元数据入库、二进制落盘、SHA-256、按板型匹配。
65+
- **TFTP**:内置 / 系统 `tftpd-hpa` 切换、根目录/监听/选项、状态查询与对账。
66+
- **服务器配置**:监听地址、数据/板/DTB/HTTP Boot 目录、网络接口(非环回)、上传限制。
67+
- **站点设置**(运行时可改):站点名、品牌、公告、维护模式、注册策略(关闭/自动生效/管理员审核)、自助租赁策略、租期上限、支持联系。
68+
69+
---
70+
71+
## 6. 电源与启动编排
72+
73+
- **电源后端**:自定义命令(`power_on_cmd` / `power_off_cmd`)或中盛继电器(串口键)。
74+
- **启动编排**:自动生成 bootcmd 与网络参数;UEFI HTTP Boot 向 axloader 发送 boot offer。
75+
- **安全**:电源/串口/TFTP 为操作敏感路径,副作用明确;敏感操作必须可审计;电源命令不得明文含敏感信息。
76+
77+
---
78+
79+
## 7. 文件与镜像
80+
81+
- **会话级文件**:会话隔离、结束清理、受 `session_file_max_mib` 限制。
82+
- **DTB 库**:平台级、按板型匹配、元数据 + 落盘。
83+
- **HTTP Boot 文件**:复用会话存储与生命周期。
84+
85+
---
86+
87+
## 8. 远程串口
88+
89+
- WebSocket 通道 `/api/v1/sessions/{id}/serial/ws`
90+
- 参数由板配置决定;同一会话独占;状态查询与诊断。
91+
92+
---
93+
94+
## 9. 审计与可观测
95+
96+
- `audit_logs`:管理动作、上下电、文件、用户/角色、租约/会话生命周期,含操作者/IP/UA/时间。
97+
- `auth_sessions`:登录会话、撤销、过期、强制下线。
98+
- 运行态诊断:TFTP 对账、串口/电源/运行态、配置自检。
99+
100+
---
101+
102+
## 10. 部署与运维
103+
104+
- 单一二进制 `ostool-server`(内嵌 Web UI)+ systemd 服务。
105+
- 配置 `/etc/ostool-server/config.toml`,首启自动生成;默认 `0.0.0.0:2999`
106+
- 数据库:MySQL(生产)/ SQLite(开发);路径归一化为绝对路径。
107+
- 安装/升级脚本支持本地源与远程拉取。
108+
109+
---
110+
111+
## 11. API 与自动化
112+
113+
- REST API `/api/v1/*`:认证、公共资源、用户面(租约/会话/文件/串口/电源)、管理面(用户/角色/板/DTB/会话/租约/TFTP/配置/站点)。
114+
- 与 ostool CLI 共用调度逻辑,可串入 CI 与回归验证。
115+
116+
---
117+
118+
## 12. 验收标准
119+
120+
1. 匿名访客可浏览资源、文档、条款。
121+
2. 普通用户可完成:登录 → 申请租赁 → 创建会话 → 上传镜像 → 连接串口 → 上下电 → 启动 → 释放 全链路。
122+
3. 管理员可完成:开通账号 → 配板/电源/启动 → 发布资源 → 监控租约 → 审计 全链路。
123+
4. 会话过期或释放后板回可用池、临时文件清理。
124+
5. 敏感操作有审计记录。
125+
6. Linux + systemd 单机部署,配置即数据,二进制无外部依赖(除 DB)。

ostool-server/CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Added
11+
12+
- *(ostool-server)* self-service account registration with configurable policy
13+
(`registration.mode` site setting: `closed` / `auto` / `approval`). Adds
14+
`users.status` column (`active` / `pending` / `rejected` / `disabled`),
15+
`POST /api/v1/auth/register`, `GET /api/v1/auth/registration-policy`, and
16+
admin approval endpoints `POST /api/v1/admin/users/{id}/approve|reject` plus
17+
`GET /api/v1/admin/users/pending`. Login now distinguishes pending/rejected
18+
accounts with dedicated messages.
19+
1020
## [0.4.2](https://github.com/drivercraft/ostool/compare/ostool-server-v0.4.1...ostool-server-v0.4.2) - 2026-06-16
1121

1222
### Fixed

ostool-server/src/api/dto.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,52 @@ pub struct LoginRequest {
2929
pub captcha_answer: String,
3030
}
3131

32+
/// Self-service registration payload. Submitted by the public `/register` page.
33+
#[derive(Debug, Clone, Serialize, Deserialize)]
34+
pub struct RegisterRequest {
35+
pub username: String,
36+
pub display_name: Option<String>,
37+
pub email: String,
38+
pub password: String,
39+
pub confirm_password: String,
40+
pub captcha_token: String,
41+
pub captcha_answer: String,
42+
/// Optional profile fields mirrors the admin create form.
43+
#[serde(default)]
44+
pub phone: Option<String>,
45+
#[serde(default)]
46+
pub department: Option<String>,
47+
#[serde(default)]
48+
pub title: Option<String>,
49+
}
50+
51+
/// Returned by `/api/v1/auth/register`. Tells the client what happened so the
52+
/// UI can show the right next-step message.
53+
#[derive(Debug, Clone, Serialize, Deserialize)]
54+
#[serde(rename_all = "snake_case", tag = "outcome")]
55+
pub enum RegisterResponse {
56+
/// Self-registration is disabled on this platform.
57+
Closed,
58+
/// Account is active and the user may log in now.
59+
Active {
60+
username: String,
61+
display_name: String,
62+
},
63+
/// Account was created but is pending admin approval.
64+
Pending {
65+
username: String,
66+
display_name: String,
67+
},
68+
}
69+
70+
/// Public endpoint that tells the register/login pages which flow to render.
71+
#[derive(Debug, Clone, Serialize, Deserialize)]
72+
pub struct RegistrationPolicyResponse {
73+
/// `closed` | `auto` | `approval`
74+
pub mode: String,
75+
pub self_service_enabled: bool,
76+
}
77+
3278
#[derive(Debug, Clone, Serialize, Deserialize)]
3379
pub struct CaptchaResponse {
3480
pub token: String,
@@ -100,6 +146,8 @@ pub struct AdminUserResponse {
100146
pub department: Option<String>,
101147
pub title: Option<String>,
102148
pub disabled: bool,
149+
/// `active` | `pending` | `rejected` | `disabled`
150+
pub status: String,
103151
pub last_login_at: Option<DateTime<Utc>>,
104152
pub created_at: DateTime<Utc>,
105153
pub updated_at: DateTime<Utc>,
@@ -566,6 +614,7 @@ pub struct SiteSettingsResponse {
566614
pub announcement: Option<String>,
567615
pub maintenance_mode: bool,
568616
pub self_service_enabled: bool,
617+
pub registration_mode: String,
569618
pub default_lease_minutes: i64,
570619
pub max_lease_minutes: i64,
571620
pub support_email: Option<String>,
@@ -582,6 +631,7 @@ pub struct SiteSettingsUpdateRequest {
582631
pub announcement: Option<String>,
583632
pub maintenance_mode: bool,
584633
pub self_service_enabled: bool,
634+
pub registration_mode: String,
585635
pub default_lease_minutes: i64,
586636
pub max_lease_minutes: i64,
587637
pub support_email: Option<String>,

0 commit comments

Comments
 (0)