rwadurian/backend/services
hailin 55cfc96464 feat(capability): 实现用户能力权限控制系统(Capability-based Permission)
借鉴 Stripe Capability 模型,实现 13 项细粒度用户功能权限控制:
LOGIN, TRADING, C2C, TRANSFER_IN/OUT, P2P_SEND/RECEIVE,
MINING_CLAIM, KYC, PROFILE_EDIT, VIEW_ASSET/TEAM/RECORDS

## 架构设计
- auth-service 为能力数据唯一写入点(DB + Redis DB14 缓存)
- 下游服务通过独立 ioredis 客户端直连 Redis DB14 检查能力(~1ms)
- 默认全部开启(fail-open):无缓存/Redis 故障 = 允许通行
- Guard 执行顺序:JwtAuthGuard → CapabilityGuard

## Phase 1: auth-service 核心
- Prisma Schema: UserCapability + CapabilityLog 两张表
- Domain: Capability 枚举, CapabilityMap 类型, Repository 接口
- Infrastructure: PrismaCapabilityRepository(含 $transaction 原子操作)
- Application: CapabilityService(Redis 缓存优先 → DB fallback → 写回 Redis TTL 1h)
- Scheduler: 每 60 秒扫描到期限制自动恢复(Redis 分布式锁防重复)
- API: GET /auth/user/capabilities (JWT), Internal CRUD API (服务间)
- 登录/refreshToken 均增加 LOGIN 能力检查

## Phase 2: 下游 CapabilityGuard
- trading-service: 14 个端点标注(TRADING/C2C/TRANSFER/P2P_SEND/VIEW_ASSET)
- contribution-service: 3 个端点标注(VIEW_RECORDS/VIEW_TEAM)
- mining-service: Guard 注册 + JwtAuthGuard accountSequence 兼容修复
- auth-service: KYC 端点标注(controller 级别 UseGuards)

## Phase 3: mining-admin-service
- CapabilityAdminService: 代理 auth-service internal API + 本地 AuditLog
- CapabilityController: Admin CRUD + 批量设置 + 变更日志查询

## Phase 4: mining-admin-web
- capability-management.tsx: 分组 Switch 开关 + 禁用 Dialog(原因+到期时间)+ 变更日志分页
- React Query hooks: useCapabilities/useSetCapability/useCapabilityLogs
- 用户详情页新增"权限管理"Tab

## Phase 5: mining-app (Flutter)
- CapabilityMap 数据模型 + ForbiddenException 异常类
- api_client.dart: 403 响应适配 ExceptionFilter 包装格式
- capabilitiesProvider: 登录后获取能力列表,fail-open 降级

## 审计修复
- CRITICAL: users.api.ts capability 方法移入 usersApi 对象内部
- P0: Flutter 403 解析路径适配 {error:{code,message}} 实际格式
- P0: 批量接口 operatorId 提升到 body 顶层匹配 auth-service 契约
- P1: mining-service JwtAuthGuard accountSequence fallback payload.sub
- P1: refreshCache 加 try/catch 防止 Redis 故障导致 500
- P1: processExpiredRestrictions 改用 upsertWithLog 事务方法
- P1: C2C upload-proof 补加 @RequireCapability('C2C')
- HIGH: internal.controller.ts 新增 capability 枚举校验
- HIGH: admin capability.controller.ts adminId fallback + query params 类型修复
- MEDIUM: setCapability 改用 $transaction 保证 upsert+log 原子性

## 部署注意
- 需运行: cd auth-service && npx prisma migrate dev --name add_user_capabilities
- 需配置: mining-admin-service .env AUTH_SERVICE_URL=http://auth-service:3010

## 待后续处理(P2)
- P2P_RECEIVE 需在业务逻辑层检查(收款方无主动请求)
- MINING_CLAIM/PROFILE_EDIT 待对应端点实现后标注
- getCapabilities 返回 Map 转 Array 丢失 reason/expiresAt 详细字段

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 22:19:56 -08:00
..
.claude fix(mpc-service): change healthcheck from wget to curl 2025-12-06 23:42:48 -08:00
admin-service feat(notification): 新增强制阅读弹窗功能(管理员可配置 requiresForceRead) 2026-02-27 19:33:51 -08:00
auth-service feat(capability): 实现用户能力权限控制系统(Capability-based Permission) 2026-02-27 22:19:56 -08:00
authorization-service feat(authorization): 提高省团队权益初始激活门槛至3000棵 2026-02-26 01:44:02 -08:00
backup-service fix(docker): 修复 referral-service Dockerfile 健康检查 URL 2025-12-14 03:05:18 -08:00
blockchain-service fix(kafka): 修复 MPC Kafka consumer 启动订阅失败后不重试的问题 2026-02-02 19:18:10 -08:00
contribution-service feat(capability): 实现用户能力权限控制系统(Capability-based Permission) 2026-02-27 22:19:56 -08:00
docs feat(contribution/wallet): 实现贡献值2.0计算与钱包存储架构 2026-01-12 06:13:18 -08:00
identity-service fix(kafka): 修复 MPC Kafka consumer 启动订阅失败后不重试的问题 2026-02-02 19:18:10 -08:00
leaderboard-service fix(leaderboard-service): 修复健康检查 API 路径 2026-01-07 18:48:34 -08:00
mining-admin-service feat(capability): 实现用户能力权限控制系统(Capability-based Permission) 2026-02-27 22:19:56 -08:00
mining-blockchain-service fix(injection): findUnique 改为 findFirst 避免命名唯一索引类型错误 2026-02-03 06:14:13 -08:00
mining-service feat(capability): 实现用户能力权限控制系统(Capability-based Permission) 2026-02-27 22:19:56 -08:00
mining-wallet-service fix(mining-wallet-service): pool-account GET :type 改为 @Public() 允许内网服务间调用 2026-02-03 09:21:39 -08:00
mpc-service perf(docker): 优化Dockerfile构建,避免最后chown整个目录 2025-12-21 19:31:58 -08:00
planting-service fix(pre-planting): getEligibility 返回 canPurchase 字段修复"待开启"问题 2026-02-26 23:36:08 -08:00
presence-service perf(docker): 优化Dockerfile构建,避免最后chown整个目录 2025-12-21 19:31:58 -08:00
referral-service fix(pricing): 修复 priceSupplement 在 Kafka 事件链中丢失的问题 2026-02-26 07:13:01 -08:00
reporting-service fix(reporting): 修复 contract.signed 事件 BigInt(undefined) 错误 2026-02-15 07:59:16 -08:00
reward-service feat(pricing): 认种树动态定价涨价系统(总部运营成本压力涨价) 2026-02-26 03:02:56 -08:00
scripts fix(cdc): 添加3171预种计划Debezium CDC connector配置 2026-02-26 18:56:42 -08:00
snapshot-service fix(snapshot): 修复备份进行中被删除导致容器崩溃的问题 2026-02-25 01:30:44 -08:00
trading-service feat(capability): 实现用户能力权限控制系统(Capability-based Permission) 2026-02-27 22:19:56 -08:00
transfer-service feat(transfer): 树转让功能全量实现(纯新增,零侵入) 2026-02-19 03:44:02 -08:00
wallet-service feat(transfer): 树转让功能全量实现(纯新增,零侵入) 2026-02-19 03:44:02 -08:00
.env.example docs(backend): 添加阿里云短信服务配置到 .env.example 2025-12-20 05:55:42 -08:00
.gitignore refactor(mpc-system): migrate to party-driven architecture with PartyID-based routing 2025-12-05 08:11:28 -08:00
README.md refactor(mpc-system): migrate to party-driven architecture with PartyID-based routing 2025-12-05 08:11:28 -08:00
deploy-mining.sh fix(cdc): deploy-mining.sh 添加预种CDC connector管理 2026-02-26 18:58:49 -08:00
deploy.sh fix(cdc): 添加3171预种计划Debezium CDC connector配置 2026-02-26 18:56:42 -08:00
docker-compose.2.0-snapshot.yml fix(snapshot): 修复备份进行中被删除导致容器崩溃的问题 2026-02-25 01:30:44 -08:00
docker-compose.2.0.yml fix: Debezium CDC 全面安全加固 (1.0 + 2.0) 2026-02-15 07:32:13 -08:00
docker-compose.infra.yml fix(mining-service): Redis DB 11 冲突修复,迁移至 DB 16 2026-01-30 02:22:20 -08:00
docker-compose.snapshot.yml fix(snapshot): PG_HOST 改用容器名 rwa-postgres 避免跨网络 DNS 冲突 2026-02-24 04:02:01 -08:00
docker-compose.yml fix(planting-service): 添加 ADMIN_SERVICE_URL 环境变量 2026-02-26 21:58:42 -08:00
init-multiple-dbs.sh feat(identity): store complete deviceInfo JSON from frontend 2025-12-07 11:08:37 -08:00

README.md

RWA Backend Services

统一部署管理 RWA 后端微服务。

架构概览

┌─────────────────────────────────────────────────────────────────┐
│                    192.168.1.100 (Gateway)                       │
│  ┌─────────────┐  ┌─────────────────────────────────────────┐  │
│  │   Nginx     │  │          MPC-System (Go)                 │  │
│  │  (Reverse   │  │  - session-coordinator (:8081)           │  │
│  │   Proxy)    │  │  - message-router (:8082)                │  │
│  │             │  │  - server-party-1/2/3 (:8083-8085)       │  │
│  └─────────────┘  │  - account-service (:8080)               │  │
│                   └─────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────────┘
                              │
                              │ Internal Network
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│                    192.168.1.111 (Backend)                       │
│  ┌─────────────────────────────────────────────────────────┐    │
│  │              Docker Compose Services                     │    │
│  │  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐       │    │
│  │  │  PostgreSQL │ │    Redis    │ │    Kafka    │       │    │
│  │  │   (:5432)   │ │   (:6379)   │ │   (:9092)   │       │    │
│  │  └─────────────┘ └─────────────┘ └─────────────┘       │    │
│  │                                                          │    │
│  │  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐       │    │
│  │  │  identity   │ │   wallet    │ │   backup    │       │    │
│  │  │  (:3000)    │ │  (:3001)    │ │  (:3002)    │       │    │
│  │  └─────────────┘ └─────────────┘ └─────────────┘       │    │
│  │                                                          │    │
│  │  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐       │    │
│  │  │  planting   │ │  referral   │ │   reward    │       │    │
│  │  │  (:3003)    │ │  (:3004)    │ │  (:3005)    │       │    │
│  │  └─────────────┘ └─────────────┘ └─────────────┘       │    │
│  │                                                          │    │
│  │  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐       │    │
│  │  │    mpc      │ │ leaderboard │ │  reporting  │       │    │
│  │  │  (:3006)    │ │  (:3007)    │ │  (:3008)    │       │    │
│  │  └─────────────┘ └─────────────┘ └─────────────┘       │    │
│  │                                                          │    │
│  │  ┌─────────────┐ ┌─────────────┐                        │    │
│  │  │authorization│ │   admin     │                        │    │
│  │  │  (:3009)    │ │  (:3010)    │                        │    │
│  │  └─────────────┘ └─────────────┘                        │    │
│  └─────────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────────┘

快速开始

1. 首次安装

# 进入服务目录
cd ~/rwadurian/backend/services

# 运行安装(自动生成安全密钥)
./deploy.sh install

2. 构建镜像

./deploy.sh build

3. 启动服务

./deploy.sh up

4. 检查状态

./deploy.sh status
./deploy.sh health

常用命令

命令 说明
./deploy.sh install 首次安装,生成配置
./deploy.sh build 构建所有 Docker 镜像
./deploy.sh up 启动所有服务
./deploy.sh down 停止所有服务
./deploy.sh restart 重启所有服务
./deploy.sh status 查看服务状态
./deploy.sh health 检查服务健康
./deploy.sh logs 查看所有日志
./deploy.sh logs <service> 查看指定服务日志
./deploy.sh migrate 运行数据库迁移
./deploy.sh rebuild-svc <name> 重建指定服务

服务列表

服务 端口 说明
identity-service 3000 身份认证服务
wallet-service 3001 钱包账本服务
backup-service 3002 MPC 备份服务
planting-service 3003 认种服务
referral-service 3004 推荐系统服务
reward-service 3005 奖励服务
mpc-service 3006 MPC 中间层服务
leaderboard-service 3007 排行榜服务
reporting-service 3008 报表服务
authorization-service 3009 授权服务
admin-service 3010 管理后台服务

基础设施

服务 端口 说明
PostgreSQL 5432 主数据库
Redis 6379 缓存/会话
Kafka 9092 消息队列
Zookeeper 2181 Kafka 协调

环境配置

配置文件 .env./deploy.sh install 自动生成,包含:

  • 数据库密码
  • JWT 密钥
  • 加密密钥
  • MPC 系统地址

重要: .env 文件包含敏感信息,请勿提交到 Git

与 MPC-System 集成

mpc-service 需要连接到运行在 192.168.1.100 上的 MPC-System

  • Session Coordinator: http://192.168.1.100:8081
  • Message Router: ws://192.168.1.100:8082

确保 192.168.1.111 能够访问 192.168.1.100 的这些端口。

故障排除

查看服务日志

./deploy.sh logs identity-service

重建单个服务

./deploy.sh rebuild-svc mpc-service

数据库连接问题

# 进入 postgres 容器
docker exec -it rwa-postgres psql -U rwa_user -d rwa_identity

清理重新开始

./deploy.sh clean  # 删除所有容器和数据
./deploy.sh install
./deploy.sh build
./deploy.sh up