99 lines
3.4 KiB
Plaintext
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 ; |