基于 Spring Boot 3.5.6 + Maven 的 RustDesk API 服务器 Java 实现版本。
这是一个完整的 RustDesk 远程桌面管理后端 API 系统,使用 Java + Spring Boot 框架开发,实现了与 Go 版本相同的功能。
- Java: 21
- Spring Boot: 3.5.6
- 认证框架: Sa-Token 1.44.0 (轻量级权限认证框架)
- Spring Data JPA: Hibernate 6.6.x
- 密码加密: BCrypt 0.10.2 (at.favre.lib)
- 第三方登录: JustAuth 1.16.7 (支持 GitHub, Google, OIDC, Lark 等)
- 验证码: Kaptcha 2.3.2
- 数据库: SQLite (开发) / MySQL / PostgreSQL (生产)
- Redis: 用于 Sa-Token 分布式 Session 存储
- API文档: Springdoc OpenAPI 2.8.13 (Swagger)
- 对象映射: MapStruct 1.6.3
- 构建工具: Maven 3.x
- ✅ 个人版API支持
- ✅ 用户认证(密码登录)
- ✅ Sa-Token 轻量级 Token 管理
- ✅ 地址簿管理
- ✅ 群组管理
- ✅ 第三方授权登录 (GitHub, Google, OIDC, Lark - 由 JustAuth 提供)
- ✅ 国际化支持
- ✅ 验证码支持 (Kaptcha)
- ✅ 用户管理
- ✅ 设备管理
- ✅ 地址簿管理
- ✅ 标签管理
- ✅ 群组管理
- ✅ OAuth配置管理
- ✅ 登录日志
- ✅ 连接审计日志
- ✅ 文件传输日志
- ✅ BCrypt密码加密 (at.favre.lib,工业标准)
- ✅ Sa-Token 轻量级认证框架
- ✅ Redis 分布式 Session 存储
- ✅ 双重认证机制 (API + Admin)
- ✅ CORS跨域支持
- ✅ 基于角色的访问控制
- ✅ 支持 MD5 遗留密码自动升级
- JDK 21+
- Maven 3.6+
- Redis 7+ (Sa-Token Session 存储)
- SQLite (开发) / MySQL 8+ / PostgreSQL 13+ (生产)
cd /path/to/your/workspace
# 项目已创建在 rustdesk-api-java 目录
Sa-Token 需要 Redis 来存储分布式 Session:
# 使用 Docker 启动 Redis
docker run -d --name redis-rustdesk -p 6379:6379 redis:7-alpine
# 或使用本地 Redis
redis-server
开发环境 (SQLite): 默认配置已设置为使用SQLite,无需额外配置。
生产环境 (MySQL):
编辑 src/main/resources/application-prod.yml
:
spring:
datasource:
url: jdbc:mysql://localhost:3306/rustdesk?serverTimezone=Asia/Shanghai
username: root
password: your_password
data:
redis:
host: localhost
port: 6379
mvn clean compile
# 开发环境
mvn spring-boot:run
# 或编译后运行
mvn clean package
java -jar target/rustdesk-api.jar
- API 端点: http://localhost:21114/api
- Admin 后台: http://localhost:21114/_admin/
- Swagger 文档: http://localhost:21114/swagger-ui.html
初次启动时会自动创建管理员账号:
- 用户名:
admin
- 密码:
admin@123
rustdesk-api-java/
├── src/main/java/com/rustdesk/api/
│ ├── config/ # 配置类
│ │ ├── SaTokenConfig.java # Sa-Token 认证配置
│ │ ├── JpaConfig.java
│ │ ├── CorsConfig.java
│ │ └── properties/
│ ├── entity/ # 实体类 (15个)
│ │ ├── User.java
│ │ ├── Peer.java
│ │ ├── AddressBook.java
│ │ └── ...
│ ├── repository/ # JPA Repository (15个)
│ ├── service/ # 业务逻辑层 (7个)
│ │ ├── UserService.java
│ │ └── ...
│ ├── controller/ # 控制器
│ │ ├── api/ # RustDesk客户端API
│ │ └── admin/ # 管理后台API
│ ├── dto/ # 数据传输对象
│ │ ├── request/
│ │ └── response/
│ ├── util/ # 工具类
│ │ ├── PasswordUtil.java # BCrypt 密码加密
│ │ └── ...
│ └── exception/ # 异常定义
│ └── GlobalExceptionHandler.java
├── src/main/resources/
│ ├── application.yml # 主配置
│ ├── application-dev.yml # 开发环境
│ ├── application-prod.yml # 生产环境
│ └── db/migration/ # Flyway数据库迁移
│ ├── V1__init_schema.sql
│ └── V2__init_data.sql
├── pom.xml
├── README.md
└── UPGRADE.md # 架构升级文档
server:
port: 21114
# Sa-Token 配置
sa-token:
token-name: satoken
timeout: 604800 # Token 有效期 7天
is-concurrent: true # 允许并发登录
is-share: false # 不共享 Token
token-style: uuid
is-read-header: true
token-prefix: "Bearer"
# Redis 配置
spring:
data:
redis:
host: localhost
port: 6379
database: 0
# RustDesk 服务器配置
rustdesk:
security:
captcha-threshold: 3 # 验证码触发次数
ban-threshold: 5 # 封禁IP触发次数
rustdesk-server:
id-server: "" # RustDesk ID服务器
relay-server: "" # RustDesk Relay服务器
api-server: "http://localhost:21114"
key: "" # 公钥
变量名 | 说明 | 示例 |
---|---|---|
REDIS_HOST |
Redis主机 | localhost |
REDIS_PORT |
Redis端口 | 6379 |
RUSTDESK_ID_SERVER |
ID服务器地址 | 192.168.1.66:21116 |
RUSTDESK_RELAY_SERVER |
Relay服务器地址 | 192.168.1.66:21117 |
RUSTDESK_API_SERVER |
API服务器地址 | http://192.168.1.66:21114 |
RUSTDESK_KEY |
RustDesk公钥 | key_content |
MYSQL_HOST |
MySQL主机 | localhost |
MYSQL_PORT |
MySQL端口 | 3306 |
MYSQL_DATABASE |
数据库名 | rustdesk |
MYSQL_USERNAME |
数据库用户名 | root |
MYSQL_PASSWORD |
数据库密码 | password |
POST /api/login # 用户登录
POST /api/logout # 用户登出
GET /api/login-options # 获取登录选项
GET /api/user/info # 当前用户信息
POST /api/user/changePassword # 修改密码
POST /api/sysinfo # 上报设备信息
GET /api/peers # 获取设备列表
POST /api/admin/login # 管理员登录
GET /api/admin/user/list # 用户列表
POST /api/admin/user/create # 创建用户
GET /api/admin/group/list # 群组列表
详细API文档请访问: http://localhost:21114/swagger-ui.html
项目使用 Flyway 进行数据库版本管理,包含15张表:
users
- 用户表user_tokens
- Token表peers
- 设备表address_books
- 地址簿表address_book_collection
- 地址簿集合address_book_collection_rule
- 集合共享规则tags
- 标签表groups
- 群组表oauth
- OAuth配置user_third
- 第三方账号绑定login_log
- 登录日志audit_conn
- 连接审计audit_file
- 文件审计share_record
- 分享记录server_cmd
- 服务器命令
- 项目架构搭建
- 所有实体类创建 (15个)
- Repository层完成 (15个)
- Service层实现 (7个核心服务)
- Controller层基础实现 (6个控制器)
- 架构升级: Spring Security → Sa-Token (详见 UPGRADE.md)
- BCrypt 密码加密 (独立库)
- Redis 分布式 Session
- 数据库迁移脚本 (Flyway)
- API文档集成 (Swagger)
- 第三方登录准备 (JustAuth)
- 时间字段类型统一 (部分实体需从LocalDateTime改为Long timestamp)
- JustAuth 第三方登录完整集成 (Lark/Feishu)
- 地址簿同步功能
- Web Client集成
- 单元测试编写
- Docker容器化部署
- 安全漏洞修复 (CVE-2018-18531, CVE-2025-48924)
-
时间戳类型不一致: 部分实体的时间字段(如ShareRecord.expire)需要从
LocalDateTime
改为Long
以与Go版本保持一致 -
CVE 安全漏洞 (详见 UPGRADE.md):
- CVE-2018-18531 (Kaptcha 9.8分): 使用 Random 而非 SecureRandom
- CVE-2025-48924 (Commons Lang 5.3分): 栈溢出风险
- 状态: 已知风险,暂时接受,计划替换
-
首次启动:
- 必须启动 Redis (端口 6379)
- 清理旧的数据库文件:
rm -f data/rustdesk.db*
需要将以下实体的时间字段改为Long类型(Unix timestamp毫秒):
// ShareRecord.java
@Column(name = "expire")
private Long expire; // 改为 Long
// 其他可能需要修改的时间字段类似处理
查看完整的架构升级文档: UPGRADE.md
组件 | v1.x | v2.0 | 改进 |
---|---|---|---|
Spring Boot | 3.2.5 | 3.5.6 | 最新稳定版 |
认证框架 | Spring Security | Sa-Token 1.44.0 | 代码减少 61% |
Token 方案 | JWT (自实现) | Sa-Token (内置) | 简化管理 |
密码加密 | Spring BCrypt | at.favre.lib BCrypt | 轻量独立 |
Session 存储 | 内存/数据库 | Redis | 分布式支持 |
依赖体积 | 5.2MB+ | 450KB | 减少 91% |
特性 | Go版本 | Java版本 | 说明 |
---|---|---|---|
核心API | ✅ | ✅ | 完全兼容 |
Web Admin | ✅ | ✅ | 功能一致 |
第三方登录 | ✅ | ✅ | GitHub/Google/OIDC/Lark (JustAuth) |
轻量级认证 | - | ✅ | Sa-Token (比 Spring Security 更轻) |
Web Client | ✅ | 待集成 | |
Docker | ✅ | 待完善 | |
性能 | 高 | 中等 | JVM启动较慢,运行时性能接近 |
欢迎提交 Issue 和 Pull Request!
本项目参考 lejianwen/rustdesk-api 项目实现。
开发时间: 2024年10月 - 2025年1月 版本: 2.0.0 (Spring Security → Sa-Token 架构升级) 作者: RustDesk API Team (Java Implementation) 架构升级: 详见 UPGRADE.md