9.4 KiB
9.4 KiB
RMDC 项目权限设计方案
1. 概述
本文档描述RMDC平台统一权限系统的设计方案,涵盖:
- 权限系统架构设计
- 模块依赖关系
- 接口抽象层设计
- 权限校验流程
2. 模块依赖关系
2.1 设计原则
- 单向依赖:业务模块不依赖权限模块,权限模块通过接口访问业务数据
- 接口抽象:公共接口定义在
rmdc-common,各模块实现具体接口 - 依赖注入:
rmdc-core负责注入所有依赖
2.2 依赖关系图
graph TB
subgraph "公共层"
Common[rmdc-common<br/>公共接口定义]
end
subgraph "权限层"
UserAuth[rmdc-user-auth<br/>权限中心<br/>实现PermissionChecker]
end
subgraph "业务层"
Jenkins[rmdc-jenkins-branch-dac<br/>实现ResourceProvider]
Watchdog[rmdc-watchdog-center<br/>实现ResourceProvider]
Monitor[rmdc-monitor-center<br/>实现ResourceProvider]
Delivery[rmdc-delivery-update<br/>实现ResourceProvider]
end
subgraph "核心层"
Core[rmdc-core<br/>网关 + 依赖注入]
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 接口
// 位置: 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 接口
// 位置: 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 校验流程图
flowchart TB
subgraph "请求入口"
Request[API请求<br/>携带JWT Token]
end
subgraph "rmdc-core 网关层"
Router[Gin Router]
AuthMW[AuthMiddleware<br/>1. JWT解析<br/>2. 提取user_id/role]
PermMW[PermissionMiddleware<br/>1. SuperAdmin跳过<br/>2. 权限检查]
end
subgraph "rmdc-user-auth 权限中心"
PermService[PermissionService]
subgraph "模块权限检查器"
JenkinsChecker[JenkinsPermissionChecker<br/>Jenkins分支权限]
WatchdogChecker[WatchdogPermissionChecker<br/>项目/主机权限]
end
subgraph "缓存层"
L1[L1: 内存缓存<br/>sync.Map]
L2[L2: 数据库缓存<br/>user_permission_trees]
end
end
subgraph "业务模块"
JenkinsHandler[JenkinsHandler<br/>无权限检查逻辑]
WatchdogHandler[WatchdogHandler<br/>无权限检查逻辑]
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 权限检查算法
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 权限分配规则
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 统一权限表
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 权限树缓存表
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 | 初始版本 |