fix: stabilize console scrolling and protect administrator login

This commit is contained in:
2026-09-30 00:09:01 +08:00
parent 9a15406f76
commit f56f233704
32 changed files with 1308 additions and 86 deletions

View File

@@ -943,3 +943,33 @@ ALTER TABLE orbit_subscriptions
ADD retired_sequence BIGINT UNSIGNED NULL COMMENT '退役事务锁定的结果流提交水位;NULL表示未退役,之后的事件不再订阅',
ADD KEY ix_subscription_active(namespace_id,retired_at),
ADD CONSTRAINT ck_subscription_retired CHECK ((retired_at IS NULL AND retired_sequence IS NULL) OR (retired_at IS NOT NULL AND retired_sequence IS NOT NULL AND enabled=FALSE AND pending_count=0));
-- 登录保护独立于业务凭据和命名空间;没有外键,不改变已有密码、会话或 Token。
CREATE TABLE orbit_console_login_guards (
kind VARCHAR(8) CHARACTER SET ascii COLLATE ascii_bin NOT NULL COMMENT 'IP 或 ACCOUNT,固定先 IP 后账号加锁',
subject CHAR(64) CHARACTER SET ascii COLLATE ascii_bin NOT NULL COMMENT 'IP 或规范账号身份的 SHA-256 十六进制键,不包含密码或 Token',
window_start DATETIME(6) NOT NULL COMMENT '固定请求限流窗口起点,UTC',
requests INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '当前窗口内已受理的尝试数,成功不归零',
failures INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '连续失败窗口内的失败数,成功后归零',
first_failed_at DATETIME(6) NULL COMMENT '失败窗口起点;空表示无连续失败',
locked_until DATETIME(6) NULL COMMENT '临时锁定截止;锁内请求不延长此时间',
expires_at DATETIME(6) NOT NULL COMMENT '非活动状态清理截止,晚于所有保护窗口',
PRIMARY KEY(kind,subject),
KEY ix_console_guard_expiry(expires_at),
CONSTRAINT ck_console_guard_kind CHECK(kind IN ('IP','ACCOUNT'))
) ENGINE=InnoDB COMMENT='跨节点持久登录限流及临时锁定状态';
CREATE TABLE orbit_console_login_audit (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '审计序号,仅用于有界倒序分页',
username VARCHAR(128) NOT NULL COMMENT '请求中的登录名,不证明账号存在',
remote_ip VARCHAR(64) CHARACTER SET ascii COLLATE ascii_bin NOT NULL COMMENT '实际连接或受信代理解析出的规范 IP',
user_agent VARCHAR(512) NOT NULL COMMENT '有界浏览器标识,不保存请求正文或认证头',
outcome VARCHAR(16) CHARACTER SET ascii COLLATE ascii_bin NOT NULL COMMENT 'PENDING/SUCCESS/INVALID/LOCKED/ACCOUNT_LIMIT/IP_LIMIT/ERROR',
created_at DATETIME(6) NOT NULL COMMENT '开始时间,UTC',
finished_at DATETIME(6) NULL COMMENT '结果确认时间,空为未完成;异常中断由清理器标 ERROR',
retry_at DATETIME(6) NULL COMMENT '被锁定或限流时的最早重试时间;否则为空',
PRIMARY KEY(id),
KEY ix_console_login_audit_time(created_at),
KEY ix_console_login_audit_pending(outcome,created_at),
CONSTRAINT ck_console_login_outcome CHECK(outcome IN ('PENDING','SUCCESS','INVALID','LOCKED','ACCOUNT_LIMIT','IP_LIMIT','ERROR'))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_as_cs COMMENT='全局登录审计,不含密码、Cookie 或 Token,仅管理员可查询';