compliance/examples/rule_repository_demo.py
2025-05-16 15:18:02 +08:00

161 lines
5.8 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
规则库演示脚本
此示例演示如何使用规则库创建、保存和加载规则。
"""
import sys
import logging
import json
import shutil
import tempfile
from pathlib import Path
from typing import Dict, Any, List
# 添加项目根目录到Python路径
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from ddms_compliance_suite.models.rule_models import (
BaseRule, PerformanceRule, SecurityRule, RESTfulDesignRule, ErrorHandlingRule,
RuleCategory, TargetType, RuleLifecycle, RuleScope, SeverityLevel
)
from ddms_compliance_suite.models.config_models import RuleRepositoryConfig, RuleStorageConfig
from ddms_compliance_suite.rule_repository.repository import RuleRepository
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
def create_test_rules() -> List[BaseRule]:
"""创建测试用的规则"""
rules = []
# 1. 性能规则 - 响应时间不超过500毫秒
performance_rule = PerformanceRule(
id="response-time-max-500ms",
name="响应时间不超过500毫秒",
description="验证API响应时间不超过500毫秒",
category=RuleCategory.PERFORMANCE,
severity=SeverityLevel.WARNING,
target_type=TargetType.API_RESPONSE,
lifecycle=RuleLifecycle.RESPONSE_VALIDATION,
scope=RuleScope.RESPONSE_TIME,
threshold=500.0,
metric="response_time",
unit="ms"
)
rules.append(performance_rule)
# 2. 安全规则 - HTTPS强制使用
security_rule = SecurityRule(
id="https-only-rule",
name="HTTPS强制使用规则",
description="验证API请求是否使用了HTTPS协议",
category=RuleCategory.SECURITY,
severity=SeverityLevel.ERROR,
target_type=TargetType.API_REQUEST,
lifecycle=RuleLifecycle.REQUEST_PREPARATION,
scope=RuleScope.SECURITY,
check_type="transport_security",
expected_value="https"
)
rules.append(security_rule)
# 3. RESTful设计规则 - URL路径格式
restful_rule = RESTfulDesignRule(
id="restful-url-pattern",
name="RESTful URL设计规则",
description="验证API URL是否符合RESTful设计规范",
category=RuleCategory.API_DESIGN,
severity=SeverityLevel.WARNING,
target_type=TargetType.API_REQUEST,
lifecycle=RuleLifecycle.REQUEST_PREPARATION,
scope=RuleScope.REQUEST_URL,
design_aspect="URL设计",
pattern=r"^/api/v\d+/[a-z0-9-]+(/[a-z0-9-]+)*$"
)
rules.append(restful_rule)
# 4. 错误处理规则 - 错误响应格式
error_rule = ErrorHandlingRule(
id="standard-error-response",
name="标准错误响应格式规则",
description="验证API错误响应是否符合标准格式",
category=RuleCategory.ERROR_HANDLING,
severity=SeverityLevel.WARNING,
target_type=TargetType.API_RESPONSE,
lifecycle=RuleLifecycle.RESPONSE_VALIDATION,
scope=RuleScope.RESPONSE_BODY,
error_code="*",
expected_status=400
)
rules.append(error_rule)
return rules
def test_rule_repository():
"""演示规则库的使用"""
# 创建临时目录用于存储规则
temp_dir = tempfile.mkdtemp(prefix="rule_repo_demo_")
logger.info(f"使用临时目录: {temp_dir}")
try:
# 创建规则库配置
config = RuleRepositoryConfig(
storage=RuleStorageConfig(
type="filesystem",
path=temp_dir
),
preload_rules=True
)
# 创建规则库
repo = RuleRepository(config)
logger.info("规则库初始化完成")
# 创建测试规则并保存到规则库
rules = create_test_rules()
for rule in rules:
saved = repo.save_rule(rule)
logger.info(f"保存规则 {rule.id} ({rule.__class__.__name__}): {'成功' if saved else '失败'}")
# 从规则库加载规则
logger.info("\n加载规则进行验证:")
for rule_id in [r.id for r in rules]:
loaded_rule = repo.get_rule(rule_id)
if loaded_rule:
logger.info(f"加载规则 {rule_id}: 成功, 类型: {loaded_rule.__class__.__name__}")
# 检查类型特定属性
if isinstance(loaded_rule, PerformanceRule):
logger.info(f" - 性能阈值: {loaded_rule.threshold} {loaded_rule.unit}")
elif isinstance(loaded_rule, SecurityRule):
logger.info(f" - 安全检查类型: {loaded_rule.check_type}, 预期值: {loaded_rule.expected_value}")
elif isinstance(loaded_rule, RESTfulDesignRule):
logger.info(f" - URL模式: {loaded_rule.pattern}")
elif isinstance(loaded_rule, ErrorHandlingRule):
logger.info(f" - 错误码: {loaded_rule.error_code}, 预期状态码: {loaded_rule.expected_status}")
else:
logger.error(f"加载规则 {rule_id}: 失败")
# 按生命周期查询规则
logger.info("\n按生命周期查询规则:")
for lifecycle in [RuleLifecycle.REQUEST_PREPARATION, RuleLifecycle.RESPONSE_VALIDATION]:
rules_for_lifecycle = repo.get_rules_by_lifecycle(lifecycle)
logger.info(f"生命周期 {lifecycle.value} 的规则数量: {len(rules_for_lifecycle)}")
for rule in rules_for_lifecycle:
logger.info(f" - {rule.id} ({rule.__class__.__name__})")
finally:
# 清理临时目录
logger.info(f"清理临时目录: {temp_dir}")
shutil.rmtree(temp_dir)
if __name__ == "__main__":
test_rule_repository()