|
|
@@ -1,107 +0,0 @@
|
|
|
--- Passkey模块数据库表结构
|
|
|
--- 用于存储用户Passkey凭据和认证挑战信息
|
|
|
-
|
|
|
--- 用户Passkey凭据表
|
|
|
-CREATE TABLE mxk_user_passkeys (
|
|
|
- ID VARCHAR(40) NOT NULL,
|
|
|
- USER_ID VARCHAR(40) NOT NULL COMMENT '用户ID',
|
|
|
- CREDENTIAL_ID VARCHAR(1024) NOT NULL COMMENT 'WebAuthn凭据ID',
|
|
|
- PUBLIC_KEY TEXT NOT NULL COMMENT '公钥信息',
|
|
|
- SIGNATURE_COUNT BIGINT DEFAULT 0 COMMENT '签名计数器',
|
|
|
- AAGUID VARCHAR(100) COMMENT '认证器AAGUID',
|
|
|
- DISPLAY_NAME VARCHAR(200) COMMENT '显示名称',
|
|
|
- DEVICE_TYPE VARCHAR(50) DEFAULT 'platform' COMMENT '设备类型:platform/cross-platform',
|
|
|
- CREATED_DATE DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
|
- LAST_USED_DATE DATETIME COMMENT '最后使用时间',
|
|
|
- STATUS INT DEFAULT 1 COMMENT '状态:0-禁用,1-启用',
|
|
|
- INST_ID VARCHAR(40) DEFAULT '1' COMMENT '机构ID',
|
|
|
- PRIMARY KEY (ID),
|
|
|
- UNIQUE KEY UK_USER_CREDENTIAL (USER_ID, CREDENTIAL_ID),
|
|
|
- KEY IDX_USER_ID (USER_ID),
|
|
|
- KEY IDX_CREDENTIAL_ID (CREDENTIAL_ID(255)),
|
|
|
- KEY IDX_STATUS (STATUS),
|
|
|
- KEY IDX_INST_ID (INST_ID)
|
|
|
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户Passkey凭据表';
|
|
|
-
|
|
|
--- 添加索引优化查询性能
|
|
|
-CREATE INDEX IDX_USER_STATUS ON mxk_user_passkeys(USER_ID, STATUS);
|
|
|
-CREATE INDEX IDX_CREATED_DATE ON mxk_user_passkeys(CREATED_DATE);
|
|
|
-CREATE INDEX IDX_LAST_USED ON mxk_user_passkeys(LAST_USED_DATE);
|
|
|
-
|
|
|
--- Passkey认证挑战表
|
|
|
-CREATE TABLE mxk_passkey_challenges (
|
|
|
- ID VARCHAR(40) NOT NULL,
|
|
|
- USER_ID VARCHAR(40) COMMENT '用户ID(可为空,支持无用户名登录)',
|
|
|
- CHALLENGE VARCHAR(1024) NOT NULL COMMENT '挑战字符串',
|
|
|
- CHALLENGE_TYPE VARCHAR(20) NOT NULL COMMENT '挑战类型:REGISTRATION/AUTHENTICATION',
|
|
|
- SESSION_ID VARCHAR(100) COMMENT '会话ID',
|
|
|
- CREATED_DATE DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
|
- EXPIRE_DATE DATETIME NOT NULL COMMENT '过期时间',
|
|
|
- STATUS INT DEFAULT 0 COMMENT '状态:0-未使用,1-已使用',
|
|
|
- INST_ID VARCHAR(40) DEFAULT '1' COMMENT '机构ID',
|
|
|
- PRIMARY KEY (ID),
|
|
|
- KEY IDX_USER_ID (USER_ID),
|
|
|
- KEY IDX_CHALLENGE_TYPE (CHALLENGE_TYPE),
|
|
|
- KEY IDX_SESSION_ID (SESSION_ID),
|
|
|
- KEY IDX_EXPIRE_DATE (EXPIRE_DATE),
|
|
|
- KEY IDX_STATUS (STATUS),
|
|
|
- KEY IDX_INST_ID (INST_ID)
|
|
|
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Passkey认证挑战表';
|
|
|
-
|
|
|
--- 添加复合索引优化查询
|
|
|
-CREATE INDEX IDX_CHALLENGE_STATUS ON mxk_passkey_challenges(CHALLENGE_TYPE, STATUS);
|
|
|
-CREATE INDEX IDX_USER_TYPE ON mxk_passkey_challenges(USER_ID, CHALLENGE_TYPE);
|
|
|
-CREATE INDEX IDX_EXPIRE_STATUS ON mxk_passkey_challenges(EXPIRE_DATE, STATUS);
|
|
|
-
|
|
|
--- 为现有用户表添加Passkey相关字段(可选方案)
|
|
|
--- 如果选择在现有mxk_userinfo表中添加字段,可以使用以下SQL:
|
|
|
-/*
|
|
|
-ALTER TABLE mxk_userinfo ADD COLUMN PASSKEY_ENABLED INT DEFAULT 0 COMMENT 'Passkey功能是否启用:0-禁用,1-启用';
|
|
|
-ALTER TABLE mxk_userinfo ADD COLUMN PASSKEY_COUNT INT DEFAULT 0 COMMENT '用户Passkey数量';
|
|
|
-ALTER TABLE mxk_userinfo ADD COLUMN LAST_PASSKEY_LOGIN DATETIME COMMENT '最后一次Passkey登录时间';
|
|
|
-
|
|
|
--- 添加索引
|
|
|
-CREATE INDEX IDX_PASSKEY_ENABLED ON mxk_userinfo(PASSKEY_ENABLED);
|
|
|
-CREATE INDEX IDX_LAST_PASSKEY_LOGIN ON mxk_userinfo(LAST_PASSKEY_LOGIN);
|
|
|
-*/
|
|
|
-
|
|
|
--- 创建清理过期挑战的存储过程
|
|
|
-DELIMITER //
|
|
|
-CREATE PROCEDURE CleanExpiredPasskeyChallenges()
|
|
|
-BEGIN
|
|
|
- DECLARE affected_rows INT DEFAULT 0;
|
|
|
-
|
|
|
- -- 删除过期的挑战记录
|
|
|
- DELETE FROM mxk_passkey_challenges
|
|
|
- WHERE EXPIRE_DATE < NOW();
|
|
|
-
|
|
|
- -- 获取影响的行数
|
|
|
- SET affected_rows = ROW_COUNT();
|
|
|
-
|
|
|
- -- 记录清理结果
|
|
|
- SELECT CONCAT('Cleaned ', affected_rows, ' expired passkey challenges') AS result;
|
|
|
-END //
|
|
|
-DELIMITER ;
|
|
|
-
|
|
|
--- 创建定时清理事件(可选)
|
|
|
-/*
|
|
|
-CREATE EVENT IF NOT EXISTS CleanPasskeyChallengesEvent
|
|
|
-ON SCHEDULE EVERY 1 HOUR
|
|
|
-DO
|
|
|
- CALL CleanExpiredPasskeyChallenges();
|
|
|
-*/
|
|
|
-
|
|
|
--- 插入一些示例数据(仅用于测试)
|
|
|
-/*
|
|
|
-INSERT INTO mxk_user_passkeys (
|
|
|
- ID, USER_ID, CREDENTIAL_ID, PUBLIC_KEY, DISPLAY_NAME, DEVICE_TYPE, INST_ID
|
|
|
-) VALUES (
|
|
|
- 'test-passkey-001',
|
|
|
- 'admin',
|
|
|
- 'test-credential-id-001',
|
|
|
- 'test-public-key-data',
|
|
|
- 'Test Passkey Device',
|
|
|
- 'platform',
|
|
|
- '1'
|
|
|
-);
|
|
|
-*/
|