-- 密码改造一期：互联网管理端身份鉴别（短信双因子 + 登录策略）
-- 执行前请备份 sys_user
--
-- 说明：
--   1. sys_user 扩展 login_policy 等字段，支持按用户覆盖登录方式
--   2. sys_login_policy 按「网络区域 + 角色」配置最低鉴别要求（如互联网 admin → SMS_2FA）
--   3. 应用配置 login.network-zone=INTERNET 且 internet-sms.enabled=true 后生效
--   4. 管理员账号须填写 phonenumber，否则无法接收登录短信

-- 1. 用户表扩展（证书登录字段一期预留；login_policy 用于登录策略）
ALTER TABLE sys_user
  ADD COLUMN cert_sn            VARCHAR(128)  DEFAULT NULL COMMENT '国密证书序列号' AFTER remark,
  ADD COLUMN cert_subject       VARCHAR(512)  DEFAULT NULL COMMENT '证书主题 DN' AFTER cert_sn,
  ADD COLUMN login_policy       VARCHAR(32)   DEFAULT 'PASSWORD' COMMENT '登录策略：PASSWORD/CERT/SMS_2FA' AFTER cert_subject;

CREATE INDEX idx_sys_user_cert_sn ON sys_user (cert_sn);

-- 2. 登录策略配置表
DROP TABLE IF EXISTS sys_login_policy;
CREATE TABLE sys_login_policy (
  policy_id     BIGINT(20)   NOT NULL AUTO_INCREMENT,
  role_key      VARCHAR(100) DEFAULT NULL COMMENT '角色权限字符，空表示默认',
  network_zone  VARCHAR(32)  NOT NULL COMMENT 'INTERNAL/INTERNET',
  policy_type   VARCHAR(32)  NOT NULL COMMENT 'CERT/SMS_2FA/PASSWORD',
  enabled       CHAR(1)      DEFAULT '1',
  remark        VARCHAR(500) DEFAULT NULL,
  create_by     VARCHAR(64)  DEFAULT '',
  create_time   DATETIME     DEFAULT NULL,
  update_by     VARCHAR(64)  DEFAULT '',
  update_time   DATETIME     DEFAULT NULL,
  PRIMARY KEY (policy_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='登录策略配置';

-- 互联网环境：超级管理员强制短信双因子
INSERT INTO sys_login_policy (role_key, network_zone, policy_type, enabled, remark, create_time)
VALUES ('admin', 'INTERNET', 'SMS_2FA', '1', '互联网超级管理员双因子', NOW());

-- 互联网环境：默认策略（未匹配角色时）
INSERT INTO sys_login_policy (role_key, network_zone, policy_type, enabled, remark, create_time)
VALUES (NULL, 'INTERNET', 'SMS_2FA', '1', '互联网管理端默认双因子', NOW());

-- 内网/专网：默认口令登录（CERT 策略枚举与 cert_sn 字段一期仅预留，证书登录接口待实施）
INSERT INTO sys_login_policy (role_key, network_zone, policy_type, enabled, remark, create_time)
VALUES (NULL, 'INTERNAL', 'PASSWORD', '1', '内网管理端默认口令登录', NOW());
