feat(auth): support username or phone login
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
-- Auth 单一登录标识增量:用户名或中国大陆手机号。
|
||||
-- 可重复执行;手机号仅从 IAM 当前用户档案回填,无法确认的账号保持 NULL。
|
||||
USE baiyue_auth;
|
||||
|
||||
DROP PROCEDURE IF EXISTS auth_add_login_phone;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE auth_add_login_phone()
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = 'baiyue_auth' AND table_name = 'auth_account' AND column_name = 'phone') THEN
|
||||
ALTER TABLE auth_account ADD COLUMN phone VARCHAR(32) NULL COMMENT '全局唯一中国大陆登录手机号' AFTER username;
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
CALL auth_add_login_phone();
|
||||
DROP PROCEDURE auth_add_login_phone;
|
||||
|
||||
DROP PROCEDURE IF EXISTS auth_backfill_login_phone;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE auth_backfill_login_phone()
|
||||
BEGIN
|
||||
IF EXISTS (
|
||||
SELECT user.phone
|
||||
FROM baiyue_iam.iam_user user
|
||||
WHERE user.deleted = 0 AND user.phone REGEXP '^1[0-9]{10}$'
|
||||
GROUP BY user.phone HAVING COUNT(DISTINCT user.auth_user_id) > 1) THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'IAM 存在重复手机号,禁止建立 Auth 唯一登录索引';
|
||||
END IF;
|
||||
UPDATE auth_account account
|
||||
JOIN baiyue_iam.iam_user user ON user.auth_user_id = account.id AND user.deleted = 0
|
||||
SET account.phone = user.phone
|
||||
WHERE account.phone IS NULL AND user.phone REGEXP '^1[0-9]{10}$';
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.statistics
|
||||
WHERE table_schema = 'baiyue_auth' AND table_name = 'auth_account'
|
||||
AND index_name = 'uk_auth_account_phone') THEN
|
||||
ALTER TABLE auth_account ADD UNIQUE KEY uk_auth_account_phone (phone);
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
CALL auth_backfill_login_phone();
|
||||
DROP PROCEDURE auth_backfill_login_phone;
|
||||
@@ -6,6 +6,7 @@ USE baiyue_auth;
|
||||
CREATE TABLE IF NOT EXISTS auth_account (
|
||||
id BIGINT NOT NULL COMMENT '统一登录账号ID(雪花ID)',
|
||||
username VARCHAR(64) NOT NULL COMMENT '全局唯一登录名',
|
||||
phone VARCHAR(32) DEFAULT NULL COMMENT '全局唯一中国大陆登录手机号',
|
||||
password_hash VARCHAR(255) NOT NULL COMMENT 'BCrypt密码哈希,禁止保存明文密码',
|
||||
display_name VARCHAR(64) NOT NULL COMMENT '登录后展示名称',
|
||||
account_status VARCHAR(20) NOT NULL DEFAULT 'ACTIVE' COMMENT '账号状态:ACTIVE正常、DISABLED停用、LOCKED锁定',
|
||||
@@ -23,6 +24,7 @@ CREATE TABLE IF NOT EXISTS auth_account (
|
||||
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY uk_auth_account_username (username),
|
||||
UNIQUE KEY uk_auth_account_phone (phone),
|
||||
KEY idx_auth_account_status (account_status, locked_until)
|
||||
) ENGINE=InnoDB COMMENT='统一登录账号表:保存平台端和商户端共用的认证凭据及账号安全状态';
|
||||
|
||||
|
||||
Reference in New Issue
Block a user