fix(sql): fix sql script

This commit is contained in:
2026-01-31 11:11:55 +08:00
parent ce12b997f4
commit d071e1a27d
32 changed files with 1687 additions and 133 deletions

View File

@@ -1,90 +0,0 @@
# 数据库初始化与权限(归档)
本项目的 schema 初始化已从历史的 `init.sql` 拆分为“基础设施初始化DB/User”与“schema 初始化DDL/DML”两部分
- **基础设施初始化DB/User**:通常由 DBA/平台完成,适用于首次部署或新环境准备。
- **schema 初始化DDL/DML**:适用于开发/测试环境的可重复重建,见 `sql/schema_post_init.sql`,并由 `scripts/db/rebuild_iam_db.sh` 一键执行。
## 1) 创建用户与数据库(首次环境准备)
在具有足够权限的数据库账号下执行:
```sql
CREATE USER iam_service_user WITH PASSWORD 'iam_service_password';
CREATE DATABASE iam_service_db OWNER iam_service_user;
GRANT ALL PRIVILEGES ON DATABASE iam_service_db TO iam_service_user;
```
注意事项:
- 生产环境不要在仓库内硬编码密码;应由密钥管理系统注入并轮换。
- 如果需要启用扩展(如 `uuid-ossp`),请确认应用用户是否有权限,或由 DBA 预先安装。
## 2) schema 重建(开发/CI
推荐使用一键脚本(会 DROP 并重建表结构):
```bash
export DATABASE_URL='postgres://iam_service_user:***@host:5432/iam_service_db'
BACKUP=1 ./scripts/db/rebuild_iam_db.sh
```
脚本会按顺序执行:
- `sql/drop_iam_schema.sql`
- `sql/schema_post_init.sql`
- `sql/verify_iam_schema.sql`
## 3) 常见问题
### 3.1 `.env` 配了 DATABASE_URL 但脚本报 “DATABASE_URL is required”
`.env` 只是“文件”,不会自动变成进程环境变量。`cargo run` 会通过 `dotenvy` 加载 `.env`,但 bash 脚本默认不会。
解决方式:
- 直接 `export DATABASE_URL=...` 后再执行脚本;或
- 保持 `.env` 存在于项目根目录,脚本会自动读取其中的 `DATABASE_URL`
### 3.2 执行脚本报 “psql: 未找到命令”
原因:系统未安装 PostgreSQL 客户端工具(`psql`/`pg_dump`),或不在 `PATH` 中。
安装方式:
- Ubuntu/Debian
```bash
sudo apt-get update && sudo apt-get install -y postgresql-client
```
- RHEL/CentOS/Fedora
```bash
sudo dnf install -y postgresql
```
- Alpine
```bash
sudo apk add postgresql-client
```
- macOSHomebrew
```bash
brew install libpq
brew link --force libpq
```
验证方式:
```bash
psql --version
```
安装完成后重新执行:
```bash
BACKUP=1 ./scripts/db/rebuild_iam_db.sh
```

View File

@@ -1,4 +1,4 @@
# IAM Service — Scalar 调用顺序指南
# IAM Service — Scalar 调用顺序指南v0.1.0
## Authentication认证方式
@@ -11,6 +11,11 @@
- 保护接口默认从 Token claim 的 `tenant_id` 推导租户
- 可选兼容 `X-Tenant-ID: <uuid>`,若同时提供 Header 与 Token则必须一致否则返回 403
访问令牌JWT`tenant_id/user_id/roles/permissions` 外,还包含:
- `apps`:租户已开通应用列表(如 `["cms","tms"]`
- `apps_version`:租户 enabled_apps 版本号(用于客户端判断是否需要刷新会话)
## 通用响应结构
成功响应:
@@ -38,6 +43,22 @@
## Step-by-step可复制流程
### Step -1数据库初始化 / 迁移(开发/测试/生产)
本服务新增了“租户已开通应用enabled_apps”与“平台超级管理员SuperAdmin”能力对应数据库新增表
- `apps`
- `tenant_entitlements`
- `tenant_enabled_apps_history`
推荐使用版本化迁移脚本初始化与升级:
- 执行迁移:`scripts/db/migrate.sh`
- 执行校验:`scripts/db/verify.sh`
- 回滚(按版本):`scripts/db/rollback.sh`
本仓库同时保留开发用的一键重建脚本:`scripts/db/rebuild_iam_db.sh`(会清库重建,不适合生产)。
### Step 0创建租户可选
**POST** `/tenants/register`
@@ -57,6 +78,23 @@
下一步依赖:`tenant_id`(用于注册/登录时的 `X-Tenant-ID`)。
### Step 0.1:平台超级管理员(可选,但推荐先完成)
数据库已内置平台租户Platform tenant
- `tenant_id = 00000000-0000-0000-0000-000000000001`
在平台租户下注册首个用户,将自动获得平台级权限(用于管理各租户 enabled_apps
**POST** `/auth/register`
- Header`X-Tenant-ID: 00000000-0000-0000-0000-000000000001`
- Body
```json
{ "email": "superadmin@example.com", "password": "securePassword123" }
```
### Step 1注册用户
**POST** `/auth/register`
@@ -120,6 +158,34 @@
下一步依赖:确认具备目标权限(例如 `user:read` / `role:read`)。
### Step 4.1平台层设置租户已开通应用SuperAdmin
该能力仅允许拥有平台级权限的用户调用:
- `iam:tenant:enabled_apps:read`
- `iam:tenant:enabled_apps:write`
#### 4.1.1 查询某租户 enabled_apps
**GET** `/platform/tenants/{tenant_id}/enabled-apps`
- Header`Authorization: Bearer <access_token>`(平台租户下登录得到的 token
#### 4.1.2 设置某租户 enabled_apps全量覆盖幂等
**PUT** `/platform/tenants/{tenant_id}/enabled-apps`
- Header`Authorization: Bearer <access_token>`
- Body
```json
{ "enabled_apps": ["cms", "tms"], "expected_version": 0 }
```
说明:
- `expected_version` 可选,用于并发控制;不匹配会返回 409。
- 登录签发 token 时会自动把 `apps/apps_version` 注入到 JWT并对 `permissions` 按 enabled_apps 过滤。
### Step 5列出用户User
**GET** `/users?page=1&page_size=20`
@@ -147,9 +213,32 @@
{ "code": 0, "message": "Success", "data": [{ "id": "<role_id>", "name": "Admin", "description": "..." }], "trace_id": null }
```
### Step 7用户-角色绑定User
用户注册后默认无角色;通常由具备 `user:write` 的管理员进行角色分配。
#### 7.1 查询用户角色列表(需要 user:read
**GET** `/users/{id}/roles`
- Header`Authorization: Bearer <access_token>`
#### 7.2 设置用户角色(全量覆盖,幂等;需要 user:write
**PUT** `/users/{id}/roles`
- Header`Authorization: Bearer <access_token>`
- Body
```json
{ "role_ids": ["<role_id_1>", "<role_id_2>"] }
```
说明:
- `role_ids` 必须全部属于当前租户,否则返回 400。
## 限流说明Auth
- `/auth/login`:约 2 req/sburst 10同一 IP
- `/auth/register`:约 1 req/sburst 5同一 IP
- 触发后返回HTTP 429 + `code=40000`

View File

@@ -102,3 +102,32 @@
说明:当前实现为物理删除。生产建议改为软删除并触发异步数据清理流程。
## 平台级接口(超级管理员)
以下接口用于管理“租户已开通应用enabled_apps仅允许拥有平台级权限的用户调用
- `iam:tenant:enabled_apps:read`
- `iam:tenant:enabled_apps:write`
### 6) 获取租户已开通应用
`GET /platform/tenants/{tenant_id}/enabled-apps`
响应:`TenantEnabledAppsResponse`
### 7) 更新租户已开通应用(全量覆盖,幂等)
`PUT /platform/tenants/{tenant_id}/enabled-apps`
请求体:
```json
{
"enabled_apps": ["cms", "tms"],
"expected_version": 0
}
```
说明:
- `expected_version` 用于并发控制;不传则按“最后写入覆盖”处理。
- 写入成功后会更新 `tenant_entitlements.version`,并将结果同步写入 `tenants.config.enabled_apps``tenants.config.enabled_apps_version`