# 统一权限架构

---
DDS-Section: 8. 权限模型 - 8.1 统一权限架构
DDS-Lines: L483-L556
---

## 设计模式

RMDC 采用**专用权限表**设计，针对不同业务场景使用独立权限表结构。

## 权限模块枚举 (PermissionModule)

```go
type PermissionModule string

const (
    // 用户模块权限
    ModuleUserRegister     PermissionModule = "user_register"
    ModuleUserManage       PermissionModule = "user_manage"
    ModuleUserPermission   PermissionModule = "user_permission"
    
    // 项目模块权限
    ModuleProjectCreate    PermissionModule = "project_create"
    ModuleProjectView      PermissionModule = "project_view"
    ModuleProjectEdit      PermissionModule = "project_edit"
    ModuleProjectExport    PermissionModule = "project_export"
    ModuleProjectAuth      PermissionModule = "project_auth"
    
    // Jenkins 模块权限
    ModuleJenkinsView      PermissionModule = "jenkins_view"
    ModuleJenkinsBuild     PermissionModule = "jenkins_build"
    ModuleJenkinsManage    PermissionModule = "jenkins_manage"
    
    // 微服务更新模块权限
    ModuleDeliveryView     PermissionModule = "delivery_view"
    ModuleDeliveryUpdate   PermissionModule = "delivery_update"
    
    // 工单模块权限
    ModuleWorkflowView     PermissionModule = "workflow_view"
    ModuleWorkflowApprove  PermissionModule = "workflow_approve"
)
```

## 模块信息注册表

```go
type PermissionModuleInfo struct {
    Code        PermissionModule `json:"code"`
    Name        string           `json:"name"`
    Description string           `json:"description"`
    ACLTable    string           `json:"acl_table"`
}

var PermissionModules = map[PermissionModule]PermissionModuleInfo{
    ModuleJenkinsView:  {Code: ModuleJenkinsView,  Name: "Jenkins查看", ACLTable: "jenkins_acls"},
    ModuleJenkinsBuild: {Code: ModuleJenkinsBuild, Name: "Jenkins构建", ACLTable: "jenkins_acls"},
    ModuleProjectView:  {Code: ModuleProjectView,  Name: "项目查看",   ACLTable: "project_acls"},
    ModuleProjectEdit:  {Code: ModuleProjectEdit,  Name: "项目编辑",   ACLTable: "project_acls"},
    // ...
}
```

## 权限表概览

| 权限类型 | 权限表 | 权限粒度 | 说明 |
|:---|:---|:---|:---|
| Jenkins 权限 | `jenkins_acls` | Org/Repo/Branch 层级 | 支持层级继承 |
| 项目权限 | `project_acls` | 项目模块级 | 项目信息访问权限 |
| 用户权限缓存 | `user_permission_caches` | 用户维度 | L2 缓存树 |

## 权限检查通用规则

```go
// 权限检查通用规则:
// 1. SuperAdmin 拥有所有权限，直接放行
// 2. 根据 PermissionModule 分流到对应的 ACL 表进行检查
// 3. 权限检查结果存入 L1 内存缓存和 L2 DB 缓存
// 4. 权限变更时同时清除 L1 和 L2 缓存

func CheckPermission(ctx context.Context, userID int64, userRole string,
    module PermissionModule, resourceID, permissionType string) (bool, error) {
    
    // Rule 1: SuperAdmin 直接放行
    if userRole == "superadmin" {
        return true, nil
    }
    
    // Rule 2: 根据模块分流检查
    moduleInfo, ok := PermissionModules[module]
    if !ok {
        return false, fmt.Errorf("unknown module: %s", module)
    }
    
    // 根据 ACLTable 选择对应的检查逻辑
    switch moduleInfo.ACLTable {
    case "jenkins_acls":
        return checkJenkinsPermission(ctx, userID, resourceID, permissionType)
    case "project_acls":
        return checkProjectPermission(ctx, userID, resourceID, permissionType)
    default:
        return false, nil
    }
}
```
