后端:
- AuditRule 新增 value 字段, rule_type 扩展 DDL/DML
- MySQL/PG/Redis 预设规则种子接口 POST /audit-rules/seed/{db_type}
- 公告管理 CRUD (announcements)
- 消息推送 CRUD+测试 (notifications: 钉钉/飞书/邮件)
- LDAP 配置 CRUD+测试连接 (ldap-config)
- 164 tests passing (+31 新增)
前端:
- AuditRulesPage 重写: DB类型Tab+DDL/DML分组+参数编辑
- SettingsPage: 系统设置主页(审核规则/公告/推送/LDAP)
- NotificationPage: 钉钉/飞书/SMTP配置
- LdapConfigPage: LDAP设置+测试连接
- AnnouncementPage: 公告Markdown编辑
- 去掉左下角角色切换demo
- 侧边栏合并为: 系统设置(含审核规则+公告+推送+LDAP)
323 lines
9.8 KiB
Python
323 lines
9.8 KiB
Python
"""Preset audit rule seed data for MySQL, PostgreSQL, and Redis."""
|
|
|
|
from typing import List, Dict, Any
|
|
|
|
# ── MySQL 预设规则 ──────────────────────────────────────────────
|
|
MYSQL_SEED_RULES: List[Dict[str, Any]] = [
|
|
{
|
|
"name": "DDLMultiToCommit",
|
|
"description": "DDL 允许单个工单提交多条DDL",
|
|
"rule_type": "DDL",
|
|
"severity": "info",
|
|
"db_type": "mysql",
|
|
"pattern": None,
|
|
"value": None,
|
|
"message": "DDL 允许单个工单提交多条DDL语句",
|
|
},
|
|
{
|
|
"name": "DDLAllowMultiAlter",
|
|
"description": "DDL 允许多alter",
|
|
"rule_type": "DDL",
|
|
"severity": "info",
|
|
"db_type": "mysql",
|
|
"pattern": None,
|
|
"value": None,
|
|
"message": "DDL 允许在单条ALTER TABLE中使用多个修改操作",
|
|
},
|
|
{
|
|
"name": "DDLAllowColumnType",
|
|
"description": "允许字段类型转换",
|
|
"rule_type": "DDL",
|
|
"severity": "warning",
|
|
"db_type": "mysql",
|
|
"pattern": None,
|
|
"value": None,
|
|
"message": "允许字段类型转换,请确认数据兼容性",
|
|
},
|
|
{
|
|
"name": "DDLAllowChangeColumnPosition",
|
|
"description": "允许 AFTER/FIRST 修改列位置",
|
|
"rule_type": "DDL",
|
|
"severity": "info",
|
|
"db_type": "mysql",
|
|
"pattern": None,
|
|
"value": None,
|
|
"message": "允许使用 AFTER/FIRST 修改列位置",
|
|
},
|
|
{
|
|
"name": "DDLEnableDropTable",
|
|
"description": "允许删表操作",
|
|
"rule_type": "DDL",
|
|
"severity": "warning",
|
|
"db_type": "mysql",
|
|
"pattern": None,
|
|
"value": None,
|
|
"message": "允许执行 DROP TABLE 操作,请确认已备份",
|
|
},
|
|
{
|
|
"name": "DDLEnablePrimaryKey",
|
|
"description": "检查表必须包含主键",
|
|
"rule_type": "DDL",
|
|
"severity": "error",
|
|
"db_type": "mysql",
|
|
"pattern": None,
|
|
"value": None,
|
|
"message": "建表必须指定主键",
|
|
},
|
|
{
|
|
"name": "DDLCheckTableComment",
|
|
"description": "强制表注释",
|
|
"rule_type": "DDL",
|
|
"severity": "warning",
|
|
"db_type": "mysql",
|
|
"pattern": None,
|
|
"value": None,
|
|
"message": "建表时必须添加表注释(COMMENT)",
|
|
},
|
|
{
|
|
"name": "DMLAllowInsertNull",
|
|
"description": "允许 Insert Null 值",
|
|
"rule_type": "DML",
|
|
"severity": "info",
|
|
"db_type": "mysql",
|
|
"pattern": None,
|
|
"value": None,
|
|
"message": "允许 INSERT 语句中包含 NULL 值",
|
|
},
|
|
{
|
|
"name": "DMLWhere",
|
|
"description": "强制 DML 语句包含 WHERE 条件",
|
|
"rule_type": "DML",
|
|
"severity": "error",
|
|
"db_type": "mysql",
|
|
"pattern": None,
|
|
"value": None,
|
|
"message": "UPDATE/DELETE 语句必须包含 WHERE 条件",
|
|
},
|
|
{
|
|
"name": "DDLMaxKeyParts",
|
|
"description": "单索引字段上限",
|
|
"rule_type": "DDL",
|
|
"severity": "warning",
|
|
"db_type": "mysql",
|
|
"pattern": None,
|
|
"value": "8",
|
|
"message": "单索引包含的字段数不得超过8个",
|
|
},
|
|
{
|
|
"name": "DDLMaxKey",
|
|
"description": "单表索引上限",
|
|
"rule_type": "DDL",
|
|
"severity": "warning",
|
|
"db_type": "mysql",
|
|
"pattern": None,
|
|
"value": "12",
|
|
"message": "单表索引数量不得超过12个",
|
|
},
|
|
{
|
|
"name": "MaxDDLAffectRows",
|
|
"description": "DDL 最大影响行数",
|
|
"rule_type": "DDL",
|
|
"severity": "warning",
|
|
"db_type": "mysql",
|
|
"pattern": None,
|
|
"value": "0",
|
|
"message": "DDL 最大影响行数为0(不限制)",
|
|
},
|
|
{
|
|
"name": "DDLMaxCharLength",
|
|
"description": "CHAR 类型最大长度",
|
|
"rule_type": "DDL",
|
|
"severity": "warning",
|
|
"db_type": "mysql",
|
|
"pattern": None,
|
|
"value": "10",
|
|
"message": "CHAR 类型长度不得超过10,超出请使用 VARCHAR",
|
|
},
|
|
{
|
|
"name": "MaxTableNameLen",
|
|
"description": "表名长度限制",
|
|
"rule_type": "DDL",
|
|
"severity": "warning",
|
|
"db_type": "mysql",
|
|
"pattern": None,
|
|
"value": "45",
|
|
"message": "表名长度不得超过45个字符",
|
|
},
|
|
{
|
|
"name": "DMLMaxInsertRows",
|
|
"description": "INSERT 最大行数限制",
|
|
"rule_type": "DML",
|
|
"severity": "warning",
|
|
"db_type": "mysql",
|
|
"pattern": None,
|
|
"value": "500",
|
|
"message": "单次 INSERT 最多插入500行",
|
|
},
|
|
]
|
|
|
|
# ── PostgreSQL 预设规则 ─────────────────────────────────────────
|
|
POSTGRES_SEED_RULES: List[Dict[str, Any]] = [
|
|
{
|
|
"name": "PGDDLMultiToCommit",
|
|
"description": "PostgreSQL DDL 允许单个工单提交多条DDL",
|
|
"rule_type": "DDL",
|
|
"severity": "info",
|
|
"db_type": "postgres",
|
|
"pattern": None,
|
|
"value": None,
|
|
"message": "DDL 允许单个工单提交多条DDL语句",
|
|
},
|
|
{
|
|
"name": "PGDDLAllowColumnType",
|
|
"description": "PostgreSQL 允许字段类型转换",
|
|
"rule_type": "DDL",
|
|
"severity": "warning",
|
|
"db_type": "postgres",
|
|
"pattern": None,
|
|
"value": None,
|
|
"message": "允许字段类型转换,请确认数据兼容性",
|
|
},
|
|
{
|
|
"name": "PGDDLEnablePrimaryKey",
|
|
"description": "PostgreSQL 检查表必须包含主键",
|
|
"rule_type": "DDL",
|
|
"severity": "error",
|
|
"db_type": "postgres",
|
|
"pattern": None,
|
|
"value": None,
|
|
"message": "建表必须指定主键",
|
|
},
|
|
{
|
|
"name": "PGDDLEnableDropTable",
|
|
"description": "PostgreSQL 允许删表操作",
|
|
"rule_type": "DDL",
|
|
"severity": "warning",
|
|
"db_type": "postgres",
|
|
"pattern": None,
|
|
"value": None,
|
|
"message": "允许执行 DROP TABLE 操作,请确认已备份",
|
|
},
|
|
{
|
|
"name": "PGDDLCheckTableComment",
|
|
"description": "PostgreSQL 强制表注释",
|
|
"rule_type": "DDL",
|
|
"severity": "warning",
|
|
"db_type": "postgres",
|
|
"pattern": None,
|
|
"value": None,
|
|
"message": "建表时必须添加表注释(COMMENT ON TABLE)",
|
|
},
|
|
{
|
|
"name": "PGDMLWhere",
|
|
"description": "PostgreSQL 强制 DML 包含 WHERE 条件",
|
|
"rule_type": "DML",
|
|
"severity": "error",
|
|
"db_type": "postgres",
|
|
"pattern": None,
|
|
"value": None,
|
|
"message": "UPDATE/DELETE 语句必须包含 WHERE 条件",
|
|
},
|
|
{
|
|
"name": "PGDMLAllowInsertNull",
|
|
"description": "PostgreSQL 允许 Insert Null 值",
|
|
"rule_type": "DML",
|
|
"severity": "info",
|
|
"db_type": "postgres",
|
|
"pattern": None,
|
|
"value": None,
|
|
"message": "允许 INSERT 语句中包含 NULL 值",
|
|
},
|
|
{
|
|
"name": "PGDDLMaxKeyParts",
|
|
"description": "PostgreSQL 单索引字段上限",
|
|
"rule_type": "DDL",
|
|
"severity": "warning",
|
|
"db_type": "postgres",
|
|
"pattern": None,
|
|
"value": "8",
|
|
"message": "单索引包含的字段数不得超过8个",
|
|
},
|
|
{
|
|
"name": "PGDDLMaxKey",
|
|
"description": "PostgreSQL 单表索引上限",
|
|
"rule_type": "DDL",
|
|
"severity": "warning",
|
|
"db_type": "postgres",
|
|
"pattern": None,
|
|
"value": "12",
|
|
"message": "单表索引数量不得超过12个",
|
|
},
|
|
{
|
|
"name": "PGMaxTableNameLen",
|
|
"description": "PostgreSQL 表名长度限制",
|
|
"rule_type": "DDL",
|
|
"severity": "warning",
|
|
"db_type": "postgres",
|
|
"pattern": None,
|
|
"value": "63",
|
|
"message": "表名长度不得超过63个字符",
|
|
},
|
|
{
|
|
"name": "PGDMLMaxInsertRows",
|
|
"description": "PostgreSQL INSERT 最大行数限制",
|
|
"rule_type": "DML",
|
|
"severity": "warning",
|
|
"db_type": "postgres",
|
|
"pattern": None,
|
|
"value": "500",
|
|
"message": "单次 INSERT 最多插入500行",
|
|
},
|
|
]
|
|
|
|
# ── Redis 预设规则 ──────────────────────────────────────────────
|
|
REDIS_SEED_RULES: List[Dict[str, Any]] = [
|
|
{
|
|
"name": "RedisAllowFlushDB",
|
|
"description": "Redis 允许 FLUSHDB 操作",
|
|
"rule_type": "DML",
|
|
"severity": "warning",
|
|
"db_type": "redis",
|
|
"pattern": None,
|
|
"value": None,
|
|
"message": "允许执行 FLUSHDB 操作,将清空当前数据库",
|
|
},
|
|
{
|
|
"name": "RedisMaxKeyLen",
|
|
"description": "Redis Key 最大长度限制",
|
|
"rule_type": "DDL",
|
|
"severity": "warning",
|
|
"db_type": "redis",
|
|
"pattern": None,
|
|
"value": "256",
|
|
"message": "Key 长度不得超过256个字符",
|
|
},
|
|
{
|
|
"name": "RedisRequireTTL",
|
|
"description": "Redis 写入操作必须设置 TTL",
|
|
"rule_type": "DML",
|
|
"severity": "error",
|
|
"db_type": "redis",
|
|
"pattern": None,
|
|
"value": None,
|
|
"message": "写入 Key 时必须设置过期时间(TTL)",
|
|
},
|
|
{
|
|
"name": "RedisDefaultTTL",
|
|
"description": "Redis 默认 TTL 值(秒)",
|
|
"rule_type": "DML",
|
|
"severity": "info",
|
|
"db_type": "redis",
|
|
"pattern": None,
|
|
"value": "3600",
|
|
"message": "默认 TTL 为3600秒(1小时)",
|
|
},
|
|
]
|
|
|
|
# 映射: db_type → 种子规则列表
|
|
SEED_RULES_MAP = {
|
|
"mysql": MYSQL_SEED_RULES,
|
|
"postgres": POSTGRES_SEED_RULES,
|
|
"redis": REDIS_SEED_RULES,
|
|
}
|