"""接口级权限配置 定义系统中所有API端点的权限配置,支持细粒度的接口级权限控制。 """ from __future__ import annotations READ_PERMISSION_ALIASES: dict[str, str] = { "subjects:list": "subjects:read", "subject_aes:list": "subject_aes:read", "fees_contracts:list": "fees_contracts:read", "project_members:list": "project_members:read", "project_members:candidates": "project_members:read", "sites:list": "sites:read", "startup_ethics:list": "startup_ethics:read", "startup_initiation:list": "startup_initiation:read", "monitoring_issues:list": "monitoring_issues:read", "drug_shipments:list": "drug_shipments:read", "audit_logs:list": "audit_logs:read", "precautions:list": "precautions:read", "subject_histories:list": "subject_histories:read", "material_equipments:list": "material_equipments:read", } def canonical_permission_key(endpoint_key: str) -> str: return READ_PERMISSION_ALIASES.get(endpoint_key, endpoint_key) # 接口级权限配置 # 格式: "业务操作名": {配置信息} API_ENDPOINT_PERMISSIONS = { # 参与者管理 (subjects) "subjects:create": { "module": "subjects", "action": "write", "description": "创建参与者", "default_roles": ["PM", "CRA"], "prerequisite_permissions": ["subjects:read", "sites:read"], }, "subjects:read": { "module": "subjects", "action": "read", "description": "查询参与者", "default_roles": ["PM", "CRA", "PV", "QA", "CTA"], "prerequisite_permissions": [], }, "subjects:update": { "module": "subjects", "action": "write", "description": "更新参与者", "default_roles": ["PM", "CRA"], "prerequisite_permissions": ["subjects:read", "sites:read"], }, "subjects:delete": { "module": "subjects", "action": "write", "description": "删除参与者", "default_roles": ["PM"], "prerequisite_permissions": ["subjects:read", "sites:read"], }, # 访视管理 (visits) "visits:create": { "module": "subjects", "action": "write", "description": "创建访视", "default_roles": ["PM", "CRA"], "prerequisite_permissions": ["subjects:read", "sites:read"], }, "visits:list": { "module": "subjects", "action": "read", "description": "查询访视列表", "default_roles": ["PM", "CRA", "PV", "QA", "CTA"], "prerequisite_permissions": [], }, "visits:update": { "module": "subjects", "action": "write", "description": "更新访视", "default_roles": ["PM", "CRA"], "prerequisite_permissions": ["subjects:read", "sites:read"], }, "visits:delete": { "module": "subjects", "action": "write", "description": "删除访视", "default_roles": ["PM"], "prerequisite_permissions": ["subjects:read", "sites:read"], }, # 参与者AE管理 "subject_aes:create": { "module": "subjects", "action": "write", "description": "创建参与者AE", "default_roles": ["PM", "CRA", "PV", "QA"], "prerequisite_permissions": ["subject_aes:read", "subjects:read", "sites:read"], }, "subject_aes:read": { "module": "subjects", "action": "read", "description": "查询参与者AE", "default_roles": ["PM", "CRA", "PV", "QA", "CTA"], "prerequisite_permissions": [], }, "subject_aes:update": { "module": "subjects", "action": "write", "description": "更新参与者AE", "default_roles": ["PM", "CRA", "PV", "QA"], "prerequisite_permissions": ["subject_aes:read", "subjects:read", "sites:read"], }, "subject_aes:delete": { "module": "subjects", "action": "write", "description": "删除参与者AE", "default_roles": ["PM"], "prerequisite_permissions": ["subject_aes:read", "subjects:read", "sites:read"], }, # 合同费用管理 (fees_contracts) "fees_contracts:create": { "module": "fees", "action": "write", "description": "创建合同费用", "default_roles": ["PM"], "prerequisite_permissions": ["fees_contracts:read", "sites:read"], }, "fees_contracts:read": { "module": "fees", "action": "read", "description": "查询合同费用", "default_roles": ["PM", "CRA", "CTA"], "prerequisite_permissions": [], }, "fees_contracts:update": { "module": "fees", "action": "write", "description": "更新合同费用", "default_roles": ["PM"], "prerequisite_permissions": ["fees_contracts:read", "sites:read"], }, "fees_contracts:delete": { "module": "fees", "action": "write", "description": "删除合同费用", "default_roles": ["PM"], "prerequisite_permissions": ["fees_contracts:read", "sites:read"], }, # 项目成员管理 "project_members:create": { "module": "project_members", "action": "write", "description": "添加项目成员", "default_roles": ["PM"], }, "project_members:read": { "module": "project_members", "action": "read", "description": "查询项目成员", "default_roles": ["PM"], }, "project_members:update": { "module": "project_members", "action": "write", "description": "更新项目成员", "default_roles": ["PM"], }, "project_members:delete": { "module": "project_members", "action": "write", "description": "删除项目成员", "default_roles": ["PM"], }, # 中心管理 "sites:create": { "module": "sites", "action": "write", "description": "创建中心", "default_roles": ["PM"], }, "sites:read": { "module": "sites", "action": "read", "description": "查询中心", "default_roles": ["PM", "CRA", "PV", "QA", "CTA"], }, "sites:update": { "module": "sites", "action": "write", "description": "更新中心", "default_roles": ["PM"], }, "sites:delete": { "module": "sites", "action": "write", "description": "删除中心", "default_roles": ["PM"], }, # 伦理记录管理 "startup_ethics:create": { "module": "startup_ethics", "action": "write", "description": "创建伦理记录", "default_roles": ["PM"], }, "startup_ethics:read": { "module": "startup_ethics", "action": "read", "description": "查询伦理记录", "default_roles": ["PM", "CRA", "PV", "QA"], }, "startup_ethics:update": { "module": "startup_ethics", "action": "write", "description": "更新伦理记录", "default_roles": ["PM"], }, "startup_ethics:delete": { "module": "startup_ethics", "action": "write", "description": "删除伦理记录", "default_roles": ["PM"], }, # 立项记录管理 "startup_initiation:create": { "module": "startup_ethics", "action": "write", "description": "创建立项记录", "default_roles": ["PM"], }, "startup_initiation:read": { "module": "startup_ethics", "action": "read", "description": "查询立项记录", "default_roles": ["PM", "CRA", "PV", "QA"], }, "startup_initiation:update": { "module": "startup_ethics", "action": "write", "description": "更新立项记录", "default_roles": ["PM"], }, "startup_initiation:delete": { "module": "startup_ethics", "action": "write", "description": "删除立项记录", "default_roles": ["PM"], }, # 项目概览 "project_overview:read": { "module": "project_overview", "action": "read", "description": "查询项目概览", "default_roles": ["PM", "CRA", "PV", "QA", "CTA"], "prerequisite_permissions": ["sites:read", "subjects:read"], }, # 监查访视问题 "monitoring_issues:read": { "module": "risk_issues", "action": "read", "description": "查询监查访视问题", "default_roles": ["PM", "CRA", "PV", "QA"], }, "monitoring_issues:create": { "module": "risk_issues", "action": "write", "description": "创建监查访视问题", "default_roles": ["PM", "CRA", "PV", "QA"], "prerequisite_permissions": ["sites:read"], }, "monitoring_issues:update": { "module": "risk_issues", "action": "write", "description": "更新监查访视问题", "default_roles": ["PM", "CRA", "PV", "QA"], "prerequisite_permissions": ["sites:read"], }, "monitoring_issues:delete": { "module": "risk_issues", "action": "write", "description": "删除监查访视问题", "default_roles": ["PM"], "prerequisite_permissions": ["sites:read"], }, # 药物发货管理 "drug_shipments:create": { "module": "materials", "action": "write", "description": "创建药物发货", "default_roles": ["PM", "CTA"], "prerequisite_permissions": ["sites:read"], }, "drug_shipments:read": { "module": "materials", "action": "read", "description": "查询药物发货", "default_roles": ["PM", "CRA", "CTA"], "prerequisite_permissions": [], }, "drug_shipments:update": { "module": "materials", "action": "write", "description": "更新药物发货", "default_roles": ["PM", "CTA"], "prerequisite_permissions": ["sites:read"], }, "drug_shipments:delete": { "module": "materials", "action": "write", "description": "删除药物发货", "default_roles": ["PM"], "prerequisite_permissions": ["sites:read"], }, # 参与者PD管理 "subject_pds:create": { "module": "subjects", "action": "write", "description": "创建参与者PD", "default_roles": ["PM", "CRA"], "prerequisite_permissions": ["subjects:read", "sites:read"], }, "subject_pds:list": { "module": "subjects", "action": "read", "description": "查询参与者PD列表", "default_roles": ["PM", "CRA", "PV", "QA"], "prerequisite_permissions": [], }, "subject_pds:update": { "module": "subjects", "action": "write", "description": "更新参与者PD", "default_roles": ["PM", "CRA"], "prerequisite_permissions": ["subjects:read", "sites:read"], }, "subject_pds:delete": { "module": "subjects", "action": "write", "description": "删除参与者PD", "default_roles": ["PM"], "prerequisite_permissions": ["subjects:read", "sites:read"], }, # 审计日志管理 "audit_logs:read": { "module": "audit_export", "action": "read", "description": "查询审计日志", "default_roles": ["PM"], }, "audit_logs:export": { "module": "audit_export", "action": "read", "description": "导出审计日志", "default_roles": ["PM"], }, # 注意事项管理 "precautions:create": { "module": "shared_library", "action": "write", "description": "创建注意事项", "default_roles": ["PM", "CRA", "PV", "QA"], }, "precautions:read": { "module": "shared_library", "action": "read", "description": "查询注意事项", "default_roles": ["PM", "CRA", "PV", "QA", "CTA"], }, "precautions:update": { "module": "shared_library", "action": "write", "description": "更新注意事项", "default_roles": ["PM", "CRA", "PV", "QA"], }, "precautions:delete": { "module": "shared_library", "action": "write", "description": "删除注意事项", "default_roles": ["PM"], }, # 立项配置管理 "setup_config:read": { "module": "setup_config", "action": "read", "description": "查询立项配置", "default_roles": ["PM", "CRA", "PV", "QA", "CTA"], "prerequisite_permissions": [], }, "setup_config:update": { "module": "setup_config", "action": "write", "description": "保存立项配置草稿", "default_roles": ["PM"], "prerequisite_permissions": ["setup_config:read"], }, "setup_config:publish": { "module": "setup_config", "action": "write", "description": "发布立项配置", "default_roles": ["PM"], "prerequisite_permissions": ["setup_config:read"], }, "setup_config:rollback": { "module": "setup_config", "action": "write", "description": "回滚立项配置版本", "default_roles": ["PM"], "prerequisite_permissions": ["setup_config:read"], }, "setup_config:delete_version": { "module": "setup_config", "action": "delete", "description": "删除立项配置版本", "default_roles": ["PM"], "prerequisite_permissions": ["setup_config:read"], }, # 项目里程碑管理 "project_milestones:read": { "module": "project_milestones", "action": "read", "description": "查询项目里程碑列表", "default_roles": ["PM", "CRA", "PV", "QA", "CTA"], }, "project_milestones:update": { "module": "project_milestones", "action": "write", "description": "更新项目里程碑", "default_roles": ["PM"], }, # 启动与授权 "startup_auth:create": { "module": "startup_auth", "action": "write", "description": "创建启动会或培训授权", "default_roles": ["PM"], }, "startup_auth:read": { "module": "startup_auth", "action": "read", "description": "查询启动会或培训授权", "default_roles": ["PM", "CRA", "PV", "CTA"], }, "startup_auth:update": { "module": "startup_auth", "action": "write", "description": "更新启动会或培训授权", "default_roles": ["PM"], }, "startup_auth:delete": { "module": "startup_auth", "action": "write", "description": "删除培训授权", "default_roles": ["PM"], }, # 模块附件管理 "fees_contracts_attachments:delete": { "module": "fees", "action": "write", "description": "删除合同费用附件", "default_roles": ["PM"], }, "startup_initiation_attachments:delete": { "module": "startup_ethics", "action": "write", "description": "删除立项记录附件", "default_roles": ["PM"], }, "startup_ethics_attachments:delete": { "module": "startup_ethics", "action": "write", "description": "删除伦理记录附件", "default_roles": ["PM"], }, "startup_auth_attachments:delete": { "module": "startup_auth", "action": "write", "description": "删除启动授权附件", "default_roles": ["PM"], }, "drug_shipments_attachments:delete": { "module": "materials", "action": "write", "description": "删除药物发货附件", "default_roles": ["PM"], }, "material_equipments_attachments:delete": { "module": "materials", "action": "write", "description": "删除物资设备附件", "default_roles": ["PM"], }, "precautions_attachments:delete": { "module": "shared_library", "action": "write", "description": "删除注意事项附件", "default_roles": ["PM"], }, "faq_attachments:delete": { "module": "shared_library", "action": "write", "description": "删除FAQ附件", "default_roles": ["PM"], }, # FAQ管理 "faq:create": { "module": "shared_library", "action": "write", "description": "创建FAQ", "default_roles": ["PM"], }, "faq:read": { "module": "shared_library", "action": "read", "description": "查询FAQ", "default_roles": ["PM", "CRA", "PV", "QA", "CTA"], }, "faq:update": { "module": "shared_library", "action": "write", "description": "更新FAQ", "default_roles": ["PM"], }, "faq:delete": { "module": "shared_library", "action": "write", "description": "删除FAQ", "default_roles": ["PM"], }, # FAQ分类管理 "faq_category:create": { "module": "shared_library", "action": "write", "description": "创建FAQ分类", "default_roles": ["PM"], }, "faq_category:read": { "module": "shared_library", "action": "read", "description": "查询FAQ分类", "default_roles": ["PM", "CRA", "PV", "QA", "CTA"], }, "faq_category:update": { "module": "shared_library", "action": "write", "description": "更新FAQ分类", "default_roles": ["PM"], }, "faq_category:delete": { "module": "shared_library", "action": "write", "description": "删除FAQ分类", "default_roles": ["PM"], }, # FAQ回复管理 "faq_reply:create": { "module": "shared_library", "action": "write", "description": "创建FAQ回复", "default_roles": ["PM", "CRA", "PV", "QA"], }, "faq_reply:delete": { "module": "shared_library", "action": "write", "description": "删除FAQ回复", "default_roles": ["PM"], }, # 病史记录管理 "subject_histories:create": { "module": "subjects", "action": "write", "description": "创建病史记录", "default_roles": ["PM", "CRA"], "prerequisite_permissions": ["subjects:read"], }, "subject_histories:read": { "module": "subjects", "action": "read", "description": "查询病史记录", "default_roles": ["PM", "CRA", "PV", "QA", "CTA"], "prerequisite_permissions": [], }, "subject_histories:update": { "module": "subjects", "action": "write", "description": "更新病史记录", "default_roles": ["PM", "CRA"], "prerequisite_permissions": ["subjects:read"], }, "subject_histories:delete": { "module": "subjects", "action": "write", "description": "删除病史记录", "default_roles": ["PM"], "prerequisite_permissions": ["subjects:read"], }, # 物资设备管理 "material_equipments:create": { "module": "materials", "action": "write", "description": "创建物资设备", "default_roles": ["PM", "CRA"], }, "material_equipments:read": { "module": "materials", "action": "read", "description": "查询物资设备", "default_roles": ["PM", "CRA", "PV", "QA", "CTA"], }, "material_equipments:update": { "module": "materials", "action": "write", "description": "更新物资设备", "default_roles": ["PM", "CRA"], }, "material_equipments:delete": { "module": "materials", "action": "write", "description": "删除物资设备", "default_roles": ["PM"], }, # 文档管理 "documents:create": { "module": "documents", "action": "write", "description": "创建文档", "default_roles": ["PM", "CRA"], }, "documents:read": { "module": "documents", "action": "read", "description": "查询文档", "default_roles": ["PM", "CRA", "PV", "QA", "CTA"], }, "documents:update": { "module": "documents", "action": "write", "description": "更新文档", "default_roles": ["PM", "CRA"], }, "documents:delete": { "module": "documents", "action": "write", "description": "删除文档", "default_roles": ["PM"], }, } def _operation_read_candidates(operation_key: str) -> list[str]: prefix = operation_key.split(":", 1)[0] candidates = [] for read_key in (f"{prefix}:read", f"{prefix}:list"): canonical_key = canonical_permission_key(read_key) if canonical_key in API_ENDPOINT_PERMISSIONS and canonical_key not in candidates: candidates.append(canonical_key) return candidates def _normalized_prerequisite_permissions(operation_key: str, config: dict) -> list[str]: prerequisites = [ canonical_permission_key(key) for key in config.get("prerequisite_permissions", []) ] verb = operation_key.split(":")[-1] if verb in {"create", "update", "delete", "export", "publish", "rollback", "delete_version"}: for read_key in _operation_read_candidates(operation_key): if read_key != operation_key and read_key not in prerequisites: prerequisites.insert(0, read_key) return list(dict.fromkeys(prerequisites)) for _operation_key, _operation_config in API_ENDPOINT_PERMISSIONS.items(): _operation_config["prerequisite_permissions"] = _normalized_prerequisite_permissions( _operation_key, _operation_config, ) # 向后兼容:业务操作名到接口级权限的映射 # 用于在接口级权限未配置时,回退到模块级权限 OPERATION_TO_ENDPOINTS: dict[str, dict[str, list[str]]] = { "subjects": { "read": [ "subjects:read", "subject_aes:read", ], "write": [ "subjects:create", "subjects:update", "subjects:delete", "subject_aes:create", "subject_aes:update", "subject_aes:delete", ], }, "visits": { "read": [ "visits:list", ], "write": [ "visits:create", "visits:update", "visits:delete", ], }, "risk_issues": { "read": [ "monitoring_issues:read", ], "write": [ "monitoring_issues:create", "monitoring_issues:update", "monitoring_issues:delete", ], }, "fees": { "read": [ "fees_contracts:read", ], "write": [ "fees_contracts:create", "fees_contracts:update", "fees_contracts:delete", "fees_contracts_attachments:delete", ], }, "project_members": { "read": [ "project_members:read", ], "write": [ "project_members:create", "project_members:update", "project_members:delete", ], }, "sites": { "read": [ "sites:read", ], "write": [ "sites:create", "sites:update", "sites:delete", ], }, "startup_ethics": { "read": [ "startup_ethics:read", "startup_initiation:read", ], "write": [ "startup_ethics:create", "startup_ethics:update", "startup_ethics:delete", "startup_initiation:create", "startup_initiation:update", "startup_initiation:delete", "startup_ethics_attachments:delete", "startup_initiation_attachments:delete", ], }, "startup_auth": { "read": [ "startup_auth:read", ], "write": [ "startup_auth:create", "startup_auth:update", "startup_auth:delete", "startup_auth_attachments:delete", ], }, "project_overview": { "read": [ "project_overview:read", ], "write": [], }, "materials": { "read": [ "drug_shipments:read", "material_equipments:read", ], "write": [ "drug_shipments:create", "drug_shipments:update", "drug_shipments:delete", "material_equipments:create", "material_equipments:update", "material_equipments:delete", "drug_shipments_attachments:delete", "material_equipments_attachments:delete", ], }, "audit_export": { "read": [ "audit_logs:read", "audit_logs:export", ], "write": [], }, "subject_histories": { "read": [ "subject_histories:read", ], "write": [ "subject_histories:create", "subject_histories:update", "subject_histories:delete", ], }, "documents": { "read": [ "documents:read", ], "write": [ "documents:create", "documents:update", "documents:delete", ], }, "project_milestones": { "read": [ "project_milestones:read", ], "write": [ "project_milestones:update", ], }, "setup_config": { "read": [ "setup_config:read", ], "write": [ "setup_config:update", "setup_config:publish", "setup_config:rollback", "setup_config:delete_version", ], }, "shared_library": { "read": [ "precautions:read", "faq:read", "faq_category:read", ], "write": [ "precautions:create", "precautions:update", "precautions:delete", "precautions_attachments:delete", "faq:create", "faq:update", "faq:delete", "faq_category:create", "faq_category:update", "faq_category:delete", "faq_reply:create", "faq_reply:delete", "faq_attachments:delete", ], }, } # 项目级权限角色列表 PROJECT_PERMISSION_ROLES = ["PM", "CRA", "PV", "QA", "CTA"] # 前置权限映射表(用于权限检查),由权限定义生成,避免展示与运行时不一致。 OPERATION_PREREQUISITES: dict[str, list[str]] = { key: config["prerequisite_permissions"] for key, config in API_ENDPOINT_PERMISSIONS.items() if config["prerequisite_permissions"] } # 系统级权限定义 # 描述管理后台各模块操作的权限归属 # PM 角色的系统级权限限定在其所负责的项目范围内 SYSTEM_PERMISSIONS: dict[str, dict] = { # 账号管理 "system:users:list": { "module": "system_users", "action": "read", "description": "查看用户列表", "roles": ["ADMIN"], }, "system:users:create": { "module": "system_users", "action": "create", "description": "创建用户", "roles": ["ADMIN"], }, "system:users:update": { "module": "system_users", "action": "update", "description": "编辑用户", "roles": ["ADMIN"], }, "system:users:disable": { "module": "system_users", "action": "update", "description": "禁用/启用用户", "roles": ["ADMIN"], }, "system:users:approve": { "module": "system_users", "action": "update", "description": "审核用户注册", "roles": ["ADMIN"], }, # 项目管理 "system:projects:list": { "module": "system_projects", "action": "read", "description": "查看项目列表", "roles": ["ADMIN"], }, "system:projects:create": { "module": "system_projects", "action": "create", "description": "创建项目", "roles": ["ADMIN"], }, "system:projects:update": { "module": "system_projects", "action": "update", "description": "编辑项目", "roles": ["ADMIN"], }, "system:projects:delete": { "module": "system_projects", "action": "delete", "description": "删除项目", "roles": ["ADMIN"], }, "system:projects:lock": { "module": "system_projects", "action": "update", "description": "锁定/解锁项目", "roles": ["ADMIN"], }, "system:projects:members": { "module": "system_projects", "action": "update", "description": "管理项目成员", "roles": ["ADMIN"], }, "system:projects:sites": { "module": "system_projects", "action": "update", "description": "管理项目中心", "roles": ["ADMIN"], }, # 权限管理 "system:permissions:read": { "module": "system_permissions", "action": "read", "description": "查看系统级权限定义", "roles": ["ADMIN", "PM"], }, "system:permissions:project_config": { "module": "system_permissions", "action": "update", "description": "配置项目接口权限", "roles": ["ADMIN", "PM"], }, "system:permissions:templates": { "module": "system_permissions", "action": "update", "description": "管理权限模板", "roles": ["ADMIN"], }, # 系统监测 "system:monitoring:metrics": { "module": "system_monitoring", "action": "read", "description": "查看系统监测指标", "roles": ["ADMIN"], }, "system:monitoring:cache_stats": { "module": "system_monitoring", "action": "read", "description": "查看缓存统计", "roles": ["ADMIN"], }, "system:monitoring:alerts": { "module": "system_monitoring", "action": "read", "description": "查看权限告警", "roles": ["ADMIN"], }, "system:monitoring:health": { "module": "system_monitoring", "action": "read", "description": "查看权限系统健康状态", "roles": ["ADMIN"], }, "system:monitoring:access_logs": { "module": "system_monitoring", "action": "read", "description": "查看权限访问日志", "roles": ["ADMIN"], }, "system:monitoring:trends": { "module": "system_monitoring", "action": "read", "description": "查看权限趋势数据", "roles": ["ADMIN"], }, "system:monitoring:reset_metrics": { "module": "system_monitoring", "action": "update", "description": "重置系统监测指标", "roles": ["ADMIN"], }, "system:monitoring:clear_alerts": { "module": "system_monitoring", "action": "update", "description": "清除告警", "roles": ["ADMIN"], }, "system:monitoring:security_logs": { "module": "system_monitoring", "action": "read", "description": "查看安全访问日志", "roles": ["ADMIN"], }, # 审计日志 "system:audit_logs:read": { "module": "system_audit", "action": "read", "description": "查看审计日志", "roles": ["ADMIN"], }, "system:audit_logs:export": { "module": "system_audit", "action": "export", "description": "导出审计日志", "roles": ["ADMIN"], }, } # 系统级权限模块标签 SYSTEM_MODULE_LABELS: dict[str, str] = { "system_users": "账号管理", "system_projects": "项目管理", "system_permissions": "权限管理", "system_monitoring": "系统监测", "system_audit": "审计日志", }