# RMDC 项目权限设计方案
## 1. 概述
本文档描述RMDC平台统一权限系统的设计方案,涵盖:
- 权限系统架构设计
- 模块依赖关系
- 接口抽象层设计
- 权限校验流程
---
## 2. 模块依赖关系
### 2.1 设计原则
- **单向依赖**:业务模块不依赖权限模块,权限模块通过接口访问业务数据
- **接口抽象**:公共接口定义在 `rmdc-common`,各模块实现具体接口
- **依赖注入**:`rmdc-core` 负责注入所有依赖
### 2.2 依赖关系图
```mermaid
graph TB
subgraph "公共层"
Common[rmdc-common
公共接口定义]
end
subgraph "权限层"
UserAuth[rmdc-user-auth
权限中心
实现PermissionChecker]
end
subgraph "业务层"
Jenkins[rmdc-jenkins-branch-dac
实现ResourceProvider]
Watchdog[rmdc-watchdog-center
实现ResourceProvider]
Monitor[rmdc-monitor-center
实现ResourceProvider]
Delivery[rmdc-delivery-update
实现ResourceProvider]
end
subgraph "核心层"
Core[rmdc-core
网关 + 依赖注入]
end
UserAuth --> Common
Jenkins --> Common
Watchdog --> Common
Monitor --> Common
Delivery --> Common
Core --> UserAuth
Core --> Jenkins
Core --> Watchdog
Core --> Monitor
Core --> Delivery
style Common fill:#4ecdc4,stroke:#087f5b
style Core fill:#ffd43b,stroke:#f08c00
style UserAuth fill:#ff6b6b,stroke:#c92a2a
```
### 2.3 依赖关系表
| 模块 | 依赖 | 实现接口 |
|------|------|----------|
| `rmdc-common` | 无 | 定义接口 |
| `rmdc-user-auth` | `rmdc-common` | `PermissionChecker` |
| `rmdc-jenkins-branch-dac` | `rmdc-common` | `ResourceProvider` |
| `rmdc-watchdog-center` | `rmdc-common` | `ResourceProvider` |
| `rmdc-core` | 所有上述模块 | - |
---
## 3. 权限接口抽象层
### 3.1 PermissionChecker 接口
```go
// 位置: rmdc-common/pkg/permission/interface.go
package permission
import "context"
// PermissionChecker 统一权限检查接口
type PermissionChecker interface {
// CheckPermission 检查用户对资源的权限
// @param userID 用户ID
// @param resourceType 资源类型: "jenkins_branch", "watchdog_project", "watchdog_host"
// @param resource 资源路径: "org/repo/branch" 或 "project_id"
// @param action 操作类型: "view", "build", "exec", "manage"
CheckPermission(ctx context.Context, userID int64, resourceType, resource, action string) (bool, error)
// IsSuperAdmin 检查是否为超级管理员
IsSuperAdmin(ctx context.Context, userID int64) (bool, error)
// GetUserRole 获取用户角色
GetUserRole(ctx context.Context, userID int64) (string, error)
}
```
### 3.2 ResourceProvider 接口
```go
// 位置: rmdc-common/pkg/resource/interface.go
package resource
import "context"
// ResourceProvider 资源提供者接口(各业务模块实现)
type ResourceProvider interface {
// GetResourceType 返回资源类型标识
GetResourceType() string
// ListResources 列出所有资源(用于权限分配UI)
ListResources(ctx context.Context) ([]Resource, error)
// ListResourcesForUser 列出用户有权限的资源
ListResourcesForUser(ctx context.Context, userID int64) ([]Resource, error)
// ValidateResource 验证资源是否存在
ValidateResource(ctx context.Context, resourcePath string) (bool, error)
}
// Resource 资源结构
type Resource struct {
Type string `json:"type"` // 资源类型
Name string `json:"name"` // 资源名称
Path string `json:"path"` // 完整路径
Children []Resource `json:"children,omitempty"`
}
```
---
## 4. 统一权限校验流程
### 4.1 校验流程图
```mermaid
flowchart TB
subgraph "请求入口"
Request[API请求
携带JWT Token]
end
subgraph "rmdc-core 网关层"
Router[Gin Router]
AuthMW[AuthMiddleware
1. JWT解析
2. 提取user_id/role]
PermMW[PermissionMiddleware
1. SuperAdmin跳过
2. 权限检查]
end
subgraph "rmdc-user-auth 权限中心"
PermService[PermissionService]
subgraph "模块权限检查器"
JenkinsChecker[JenkinsPermissionChecker
Jenkins分支权限]
WatchdogChecker[WatchdogPermissionChecker
项目/主机权限]
end
subgraph "缓存层"
L1[L1: 内存缓存
sync.Map]
L2[L2: 数据库缓存
user_permission_trees]
end
end
subgraph "业务模块"
JenkinsHandler[JenkinsHandler
无权限检查逻辑]
WatchdogHandler[WatchdogHandler
无权限检查逻辑]
end
subgraph "数据库"
PermDB[(user_permissions)]
end
Request --> Router --> AuthMW --> PermMW
PermMW -->|SuperAdmin| JenkinsHandler
PermMW -->|SuperAdmin| WatchdogHandler
PermMW -->|其他角色| PermService
PermService --> L1
L1 -->|未命中| L2
L2 -->|未命中| PermDB
PermService -->|有权限| JenkinsHandler
PermService -->|有权限| WatchdogHandler
PermService -->|无权限| Request
style PermMW fill:#ff6b6b,stroke:#c92a2a,stroke-width:2px
style PermService fill:#ffd43b,stroke:#f08c00,stroke-width:2px
```
### 4.2 权限检查算法
```mermaid
flowchart TD
Start[开始权限检查] --> GetRole[获取用户角色]
GetRole --> IsSuperAdmin{superadmin?}
IsSuperAdmin -->|是| Allow[✅ 允许访问]
IsSuperAdmin -->|否| CheckL1[检查L1内存缓存]
CheckL1 --> L1Hit{缓存命中?}
L1Hit -->|是| CheckPerm[检查权限树]
L1Hit -->|否| CheckL2[检查L2数据库缓存]
CheckL2 --> L2Hit{缓存命中?}
L2Hit -->|是| UpdateL1[更新L1缓存]
L2Hit -->|否| BuildTree[从权限表构建权限树]
UpdateL1 --> CheckPerm
BuildTree --> SaveL2[保存到L2缓存]
SaveL2 --> UpdateL1
CheckPerm --> HasPerm{有权限?}
HasPerm -->|是| Allow
HasPerm -->|否| Deny[❌ 拒绝访问]
```
---
## 5. 角色权限模型
### 5.1 角色定义
| 角色 | 常量 | 说明 |
|------|------|------|
| **超级管理员** | `superadmin` | 拥有全部权限,可管理所有用户和资源 |
| **管理员** | `admin` | 拥有分配的权限,可将自有权限分配给normal/third |
| **普通人员** | `normal` | 拥有分配的权限,无分配能力 |
| **三方人员** | `third` | 拥有分配的权限,无分配能力,权限受限最严格 |
### 5.2 模块级权限
#### Jenkins分支权限
| 资源类型 | 权限类型 | 说明 |
|----------|----------|------|
| Organization | can_view, can_build | 组织级权限,自动继承到子仓库/分支 |
| Repository | can_view, can_build | 仓库级权限,自动继承到子分支 |
| Branch | can_view, can_build | 分支级权限,最细粒度 |
#### Watchdog项目权限
| 资源类型 | 权限类型 | 说明 |
|----------|----------|------|
| Project | can_view, can_manage | 项目级权限 |
| Host | can_view, can_exec | 主机操作权限 |
| Namespace | can_view, can_deploy | K8s命名空间权限 |
### 5.3 权限分配规则
```mermaid
flowchart LR
SuperAdmin[SuperAdmin] -->|可分配| Admin
SuperAdmin -->|可分配| Normal
SuperAdmin -->|可分配| Third
Admin -->|可分配自有权限| Normal
Admin -->|可分配自有权限| Third
style SuperAdmin fill:#ff6b6b
style Admin fill:#ffd43b
style Normal fill:#4ecdc4
style Third fill:#a9e34b
```
---
## 6. 数据库设计
### 6.1 统一权限表
```sql
CREATE TABLE user_permissions (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL,
resource_type VARCHAR(50) NOT NULL, -- 'jenkins_branch', 'watchdog_project'
resource_path VARCHAR(255) NOT NULL, -- 'org/repo/branch' or 'project_id'
permission_level VARCHAR(20), -- 'org', 'repo', 'branch', 'project'
can_view BOOLEAN DEFAULT FALSE,
can_build BOOLEAN DEFAULT FALSE, -- Jenkins特有
can_exec BOOLEAN DEFAULT FALSE, -- Watchdog特有
can_manage BOOLEAN DEFAULT FALSE,
granted_by BIGINT,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW(),
UNIQUE(user_id, resource_type, resource_path),
INDEX idx_user_resource (user_id, resource_type)
);
```
### 6.2 权限树缓存表
```sql
CREATE TABLE user_permission_trees (
user_id BIGINT PRIMARY KEY,
tree JSON NOT NULL, -- 完整权限树JSON
version BIGINT DEFAULT 0, -- 版本号
updated_at TIMESTAMP DEFAULT NOW()
);
```
---
## 7. API设计
### 7.1 用户权限查询API
| 接口 | 方法 | 说明 |
|------|------|------|
| `/api/permissions/my-tree/organizations` | GET | 获取当前用户的组织列表 |
| `/api/permissions/my-tree/repositories` | POST | 获取当前用户的仓库列表 |
| `/api/permissions/my-tree/branches` | POST | 获取当前用户的分支列表 |
| `/api/permissions/my-tree/full` | GET | 获取完整权限树 |
### 7.2 权限管理API (Admin)
| 接口 | 方法 | 说明 |
|------|------|------|
| `/api/permissions/tree` | GET | 获取系统权限树 |
| `/api/permissions/:userId` | GET | 获取用户权限详情 |
| `/api/permissions/assign` | POST | 分配权限 |
| `/api/permissions/copy` | POST | 复制权限 |
---
## 8. 文档版本
| 版本 | 日期 | 修改内容 |
|------|------|----------|
| v1.0 | 2025-12-10 | 初始版本 |