2026-01-29 18:14:47 +08:00
2026-01-29 18:14:47 +08:00
2026-01-29 18:14:47 +08:00
2026-01-29 18:14:47 +08:00
2026-01-29 18:14:47 +08:00
2026-01-29 18:14:47 +08:00
2026-01-29 18:14:47 +08:00
2026-01-29 18:14:47 +08:00
2026-01-29 18:14:47 +08:00

iam-service多租户 IAM 服务)

一个基于 Rust 的多租户身份识别与访问管理IAM服务雏形当前提供“租户隔离 + 用户注册”能力并为后续扩展登录、JWT 认证、授权RBAC/ABAC、租户管理等功能预留了模块边界。

技术栈

  • 语言与运行时Rustedition 2024、Tokio
  • WebAxum
  • 数据库PostgreSQL + SQLx
  • 密码Argon2
  • TokenJWT签发已实现验签/认证中间件待补齐)
  • 可观测性tracing + common-telemetry(私有 registrykellnr
  • API 文档utoipa + Scalar/scalar

系统架构

请求链路(当前)

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 过滤

项目结构说明

快速开始

环境要求

  • Rust支持 edition 2024 的版本(建议使用最新 stable
  • PostgreSQL建议 14+

安装与运行

  1. 克隆仓库并进入目录
git clone <your-repo-url>
cd iam-service
  1. 初始化数据库(示例)
psql -h <pg_host> -U <admin_user> -f init.sql
  1. 配置环境变量
cp .env.example .env

按需修改 .env

  • DATABASE_URLPostgreSQL 连接串
  • JWT_SECRETJWT 签名密钥(务必替换为强随机字符串)
  • PORT:监听端口
  1. 启动服务
cargo run

启动后:

  • 服务地址:http://127.0.0.1:<PORT>
  • API 文档:http://127.0.0.1:<PORT>/scalar

核心功能与 API

用户注册

POST /auth/register(需要请求头 X-Tenant-ID

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"}'

返回(示例):

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "email": "user@example.com"
}

登录与鉴权(待完善)

代码中已存在 AuthService::login() 与 JWT 签发工具,但目前没有对外暴露的 HTTP 路由,也未实现 JWT 验签/认证中间件与权限控制。

多租户使用指南

创建租户

当前无“租户管理 API”建议通过 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、限流与审计日志视需求

测试

cargo test

当前仓库尚未包含单元测试/集成测试用例;建议在新增登录、鉴权与授权功能时补充覆盖(尤其是租户隔离与权限边界)。

Description
No description provided
Readme 279 KiB
Languages
Rust 89.5%
PLpgSQL 5.1%
Shell 4.8%
Dockerfile 0.6%