feat(project): init

This commit is contained in:
2026-01-29 18:14:47 +08:00
commit bb82c75834
15 changed files with 3715 additions and 0 deletions

162
README.md Normal file
View File

@@ -0,0 +1,162 @@
# iam-service多租户 IAM 服务)
一个基于 Rust 的多租户身份识别与访问管理IAM服务雏形当前提供“租户隔离 + 用户注册”能力并为后续扩展登录、JWT 认证、授权RBAC/ABAC、租户管理等功能预留了模块边界。
## 技术栈
- 语言与运行时Rustedition 2024、Tokio
- WebAxum
- 数据库PostgreSQL + SQLx
- 密码Argon2
- TokenJWT签发已实现验签/认证中间件待补齐)
- 可观测性tracing + `common-telemetry`(私有 registrykellnr
- API 文档utoipa + Scalar`/scalar`
## 系统架构
### 请求链路(当前)
```mermaid
flowchart LR
C[Client] -->|HTTP + JSON| R[Axum Router]
R --> M[租户中间件 resolve_tenant]
M --> H[Handlers]
H --> S[Services]
S --> DB[(PostgreSQL)]
H --> O[统一错误 AppError]
R --> D[OpenAPI/Scalar /scalar]
```
### 多租户实现方式
当前采用“共享数据库 + 共享表,通过 `tenant_id` 区分”的模式:
- `users.tenant_id` 外键引用 `tenants.id`(强制用户必须归属某个租户)
- `users(tenant_id, email)` 联合唯一索引(同租户邮箱唯一,不同租户可重复)
- HTTP 层通过请求头 `X-Tenant-ID: <uuid>` 传入租户上下文,并在 Service/SQL 查询中使用 `tenant_id` 过滤
## 项目结构说明
- [src/main.rs](file:///home/shay/project/backend/iam-service/src/main.rs)服务入口、路由组装、Telemetry 初始化、DB 连接池初始化
- [src/config/mod.rs](file:///home/shay/project/backend/iam-service/src/config/mod.rs):环境变量配置加载
- [src/db/mod.rs](file:///home/shay/project/backend/iam-service/src/db/mod.rs)PostgreSQL 连接池初始化(迁移功能目前未启用)
- [src/middleware/mod.rs](file:///home/shay/project/backend/iam-service/src/middleware/mod.rs):多租户中间件与 `TenantId` 提取器
- [src/handlers/mod.rs](file:///home/shay/project/backend/iam-service/src/handlers/mod.rs)HTTP Handler控制器层负责参数解析、调用 Service、返回统一响应
- [src/services/mod.rs](file:///home/shay/project/backend/iam-service/src/services/mod.rs):业务逻辑(注册/登录)与数据库交互
- [src/models.rs](file:///home/shay/project/backend/iam-service/src/models.rs)DB Model 与请求/响应 DTO同时用于 OpenAPI Schema
- [src/utils/mod.rs](file:///home/shay/project/backend/iam-service/src/utils/mod.rs):密码哈希与 JWT 签发工具
- [init.sql](file:///home/shay/project/backend/iam-service/init.sql):初始化数据库/表结构的 SQL包含 tenants/users
## 快速开始
### 环境要求
- Rust支持 edition 2024 的版本(建议使用最新 stable
- PostgreSQL建议 14+
### 安装与运行
1. 克隆仓库并进入目录
```bash
git clone <your-repo-url>
cd iam-service
```
2. 初始化数据库(示例)
```bash
psql -h <pg_host> -U <admin_user> -f init.sql
```
3. 配置环境变量
```bash
cp .env.example .env
```
按需修改 `.env`
- `DATABASE_URL`PostgreSQL 连接串
- `JWT_SECRET`JWT 签名密钥(务必替换为强随机字符串)
- `PORT`:监听端口
4. 启动服务
```bash
cargo run
```
启动后:
- 服务地址:`http://127.0.0.1:<PORT>`
- API 文档:`http://127.0.0.1:<PORT>/scalar`
## 核心功能与 API
### 用户注册
`POST /auth/register`(需要请求头 `X-Tenant-ID`
```bash
curl -X POST "http://127.0.0.1:3000/auth/register" \
-H "Content-Type: application/json" \
-H "X-Tenant-ID: 11111111-1111-1111-1111-111111111111" \
-d '{"email":"user@example.com","password":"securePassword123"}'
```
返回(示例):
```json
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"email": "user@example.com"
}
```
### 登录与鉴权(待完善)
代码中已存在 `AuthService::login()` 与 JWT 签发工具,但目前没有对外暴露的 HTTP 路由,也未实现 JWT 验签/认证中间件与权限控制。
## 多租户使用指南
### 创建租户
当前无“租户管理 API”建议通过 SQL 初始化租户:
```sql
INSERT INTO tenants (id, name) VALUES ('22222222-2222-2222-2222-222222222222', 'Tenant A');
```
### 访问租户资源
所有请求都需要携带租户头:
- `X-Tenant-ID: <tenant_uuid>`
建议在后续迭代中:
-`tenant_id` 与用户身份绑定JWT claims / session
- 校验请求头租户与 token 内租户一致,避免伪造跨租户访问
## 部署指南
### 本地/测试环境
- 使用 `.env` 配置连接串、端口、日志等
- 直接运行:`cargo run`
### 生产环境(建议)
- 构建:`cargo build --release`
- 以环境变量方式注入 `DATABASE_URL/JWT_SECRET/...`,避免把 `.env` 放入镜像或仓库
- 使用反向代理Nginx/Envoy处理 TLS、限流与审计日志视需求
## 测试
```bash
cargo test
```
当前仓库尚未包含单元测试/集成测试用例;建议在新增登录、鉴权与授权功能时补充覆盖(尤其是租户隔离与权限边界)。