Files
Omni_kernel.db/permission/checklogin.txt
T
2026-02-06 15:09:39 +08:00

99 lines
3.4 KiB
Plaintext

DELIMITER //
CREATE OR REPLACE PROCEDURE checklogin(
IN p_token VARCHAR(100),
IN p_userid VARCHAR(100),
IN p_pwd VARCHAR(200),
IN p_logintype VARCHAR(10) -- 由 app 或 web 或其他來源登入
)
/*
Function : 判斷能否 Login(前端登入時呼叫), 如果可以就傳回 Token
Description: 判斷 Token 是否過期, 若未過期, 傳回 0, 已過期傳回 9, 密碼錯誤傳回 4
Build Date : 2018/03/02
Modify History
Item Who Date Modify Docs
==== ========== ========== ================================================
1 Michael 2018/01/08 開始改寫為 MySQL 版
2 Michael 2018-03-20 新增 isstop 帳號停用的判斷
3 Michael 2018-03-26 回傳值改為 2個 dataset 傳回 code,msg,recno 後面才接 data 內容
4 Michael 2022-11-26 新增 join 部門資料, 存在 localStoreage
5 Michael 2023-02-04 新增 join 公司名稱, 存在 localStoreage
Call Sample:
CALL checklogin('token123', 'user01', 'password123', 'web');
*/
BEGIN
DECLARE v_uuid VARCHAR(36);
DECLARE v_lastlogintime DATETIME;
DECLARE v_recno INT;
DECLARE v_diffhour INT;
DECLARE v_statuscode INT;
DECLARE v_errMsg VARCHAR(200);
DECLARE v_newtoken VARCHAR(100);
DECLARE v_longday INT; -- 0: token 永久有效 其他: token 的效期天數
SET v_longday = 0; -- token 預設永久有效
SET v_statuscode = 9;
SET v_errMsg = 'Token 過期或錯誤!';
SET v_recno = 0;
SET v_newtoken = '';
-- 檢查 token 是否有效
SELECT COUNT(*), MAX(lastlogintime) INTO v_recno, v_lastlogintime
FROM sys_users
WHERE userid = p_userid
AND IFNULL(isstop, '') <> 'Y'
AND IFNULL(token, 'null') = p_token
GROUP BY token;
IF v_recno > 0 THEN
SELECT TIMESTAMPDIFF(HOUR, v_lastlogintime, NOW()) INTO v_diffhour;
IF v_diffhour >= 24*v_longday AND v_longday > 0 THEN
SET v_statuscode = 9;
SET v_errMsg = 'token 已過期,請重新登入!';
ELSE
SET v_statuscode = 0;
SET v_errMsg = '登入成功!';
SET v_newtoken = p_token;
END IF;
ELSE
SET v_recno = 0;
SELECT COUNT(*) INTO v_recno
FROM sys_users
WHERE userid = p_userid
AND IFNULL(isstop, '') <> 'Y'
AND IFNULL(pwd, '') = p_pwd;
IF v_recno > 0 THEN
SET v_uuid = UUID();
UPDATE sys_users SET token = v_uuid, lastlogintime=NOW() WHERE userid = p_userid;
SET v_newtoken = v_uuid;
SET v_statuscode = 0;
SET v_errMsg = '登入成功!';
ELSE
SET v_statuscode = 4;
SET v_errMsg = '帳號或密碼輸入錯誤!';
END IF;
END IF;
-- 寫入 log(return error)
CALL api_log(v_newtoken, v_errMsg);
-- 回傳值 dataset[0], 前3個欄位有固定的內容
SELECT v_statuscode AS code, v_errMsg AS msg, v_recno AS recno;
-- 回傳值 dataset[1], 順便回傳 user info
SELECT
u.*,
d.departmentid,
d.departmentcname,
IFNULL(x.pvalue, 'Kylin Admin') AS corpname
FROM sys_users u
LEFT JOIN basperson p ON p.personid = u.userid
LEFT JOIN basdepartment d ON d.departmentid = p.departmentid
LEFT JOIN sys_parameter x ON x.pid = 'corpname'
WHERE IFNULL(u.token, 'null') = v_newtoken;
END//
DELIMITER ;