# 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 | 初始版本 |