sync: 同步 sql-platform-pro 最新代码 — 权限体系安全修复 v0.8.1

- P0: 实例访问控制全线接入权限组 (829测试)
- P1: permissions字段激活 + 操作级权限检查 (843测试)
- 前端: 删除数据权限页面, 权限组合并为唯一入口
- 新增: CodeMirror编辑器 + 查询模板 + 慢查询分析
- 新增: MongoDB管理页面 + Dashboard增强
- 修复: Pydantic V2迁移 + 前端TS错误修复
This commit is contained in:
logan committed 2026-05-23 14:41:06 +08:00
1 parent 6fcd9465cf
commit 4c9427e546
105 files changed
+23680 -471

No files matched your search

+38 -3
View File
@@ -1,4 +1,10 @@
"""Redis management API endpoints."""
"""Redis management API endpoints.
集成 RedisCommandValidator 进行只读命令安全验证:
- developer 角色仅允许执行只读命令
- admin/dba 角色可执行所有命令
- FLUSHDB 等高危操作仅限 admin
"""
from typing import Optional
from fastapi import APIRouter, Depends, HTTPException, Query
@@ -11,6 +17,7 @@ from app.core.security import get_current_user, require_role
from app.models.user import User
from app.models.instance import Instance
from app.services import redis_connector
from app.services.redis_validator import RedisCommandValidator
router = APIRouter(tags=["Redis管理"])
@@ -196,10 +203,38 @@ async def execute_redis_command(
instance_id: int,
data: RedisCommandRequest,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(require_role("admin", "dba")),
current_user: User = Depends(get_current_user),
):
"""执行命令."""
"""执行 Redis 命令(带安全验证)。
权限控制:
- developer 角色只能执行只读命令(白名单内的 GET, HGETALL 等)
- admin/dba 角色可以执行所有命令(但 FLUSHDB/FLUSHALL 仍仅限 admin)
"""
instance = await _get_redis_instance(instance_id, db)
# 提取命令关键字用于权限判断
parts = data.command.strip().split()
if not parts:
raise HTTPException(status_code=400, detail="命令不能为空")
cmd = parts[0].upper()
# ── 权限校验 ────────────────────────────────────────────────
# FLUSHDB / FLUSHALL 仅 admin 可用
if cmd in ("FLUSHDB", "FLUSHALL"):
if current_user.role != "admin":
raise HTTPException(
status_code=403, detail=f"Redis 命令 '{cmd}' 仅限 admin 执行"
)
else:
# developer 只允许只读命令
if current_user.role == "developer":
is_safe, error_msg = RedisCommandValidator.validate(data.command)
if not is_safe:
raise HTTPException(status_code=403, detail=error_msg)
# admin/dba 允许所有命令(上面已拦截 FLUSHDB/FLUSHALL)
try:
output = await redis_connector.RedisConnector.execute_command(
instance, data.db, data.command