video-shuoshan/backend/apps/generation/migrations/0006_anomaly_detection_phase2.py
seaislee1209 be656900c0
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 2m13s
feat: v0.9.7 登录风控第二期 — IP归属地解析 + 异常检测(R1-R5) + 飞书告警 + 自动封禁
- IP138 在线 API + ip2region 离线库双通道归属地解析,60 秒熔断降级
- 5 条异常检测规则:地区不对/不可能旅行/频繁登录/团队遍地开花/海外IP太杂
- 飞书 interactive 卡片告警(红色严重/橙色警告),含辅助指标
- R2 自动封禁用户、R4 自动封禁团队,封禁即踢下线
- 系统设置页全局配置 + 团队详情页独立阈值覆盖
- 安全日志页面 + 管理员修改密码入口

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-19 00:02:56 +08:00

94 lines
3.5 KiB
Python

# Generated by Django 4.2.29 on 2026-03-18 12:11
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('generation', '0005_quotaconfig_max_desktop_sessions_and_more'),
]
operations = [
migrations.AddField(
model_name='quotaconfig',
name='alert_cooldown_seconds',
field=models.IntegerField(default=1800, verbose_name='告警冷却时间(秒)'),
),
migrations.AddField(
model_name='quotaconfig',
name='anomaly_detection_enabled',
field=models.BooleanField(default=False, verbose_name='异常检测总开关'),
),
migrations.AddField(
model_name='quotaconfig',
name='feishu_alert_mobiles',
field=models.CharField(blank=True, default='', max_length=500, verbose_name='飞书告警接收人手机号'),
),
migrations.AddField(
model_name='quotaconfig',
name='r1_enabled_default',
field=models.BooleanField(default=True, verbose_name='R1 默认开关'),
),
migrations.AddField(
model_name='quotaconfig',
name='r2_enabled_default',
field=models.BooleanField(default=True, verbose_name='R2 默认开关'),
),
migrations.AddField(
model_name='quotaconfig',
name='r2_window_seconds',
field=models.IntegerField(default=3600, verbose_name='R2 默认时间窗口(秒)'),
),
migrations.AddField(
model_name='quotaconfig',
name='r3_enabled_default',
field=models.BooleanField(default=True, verbose_name='R3 默认开关'),
),
migrations.AddField(
model_name='quotaconfig',
name='r3_max_count',
field=models.IntegerField(default=10, verbose_name='R3 默认最大登录次数'),
),
migrations.AddField(
model_name='quotaconfig',
name='r3_window_seconds',
field=models.IntegerField(default=3600, verbose_name='R3 默认时间窗口(秒)'),
),
migrations.AddField(
model_name='quotaconfig',
name='r4_city_count',
field=models.IntegerField(default=5, verbose_name='R4 默认预期外城市数'),
),
migrations.AddField(
model_name='quotaconfig',
name='r4_enabled_default',
field=models.BooleanField(default=True, verbose_name='R4 默认开关'),
),
migrations.AddField(
model_name='quotaconfig',
name='r4_window_seconds',
field=models.IntegerField(default=3600, verbose_name='R4 默认时间窗口(秒)'),
),
migrations.AddField(
model_name='quotaconfig',
name='r5_country_count',
field=models.IntegerField(default=10, verbose_name='R5 默认海外国家数'),
),
migrations.AddField(
model_name='quotaconfig',
name='r5_days',
field=models.IntegerField(default=7, verbose_name='R5 默认统计天数'),
),
migrations.AddField(
model_name='quotaconfig',
name='r5_enabled_default',
field=models.BooleanField(default=True, verbose_name='R5 默认开关'),
),
migrations.AddField(
model_name='quotaconfig',
name='sms_alert_mobiles',
field=models.CharField(blank=True, default='', max_length=500, verbose_name='短信告警手机号(预留)'),
),
]