日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

利用MYSQL的函数实现用户登录功能,进出都是JSON(第一版)

發(fā)布時(shí)間:2024/4/17 数据库 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用MYSQL的函数实现用户登录功能,进出都是JSON(第一版) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

以HMAC密鑰形式發(fā)放密鑰令牌

功能如下

1:記錄用戶的登錄的IP地址、時(shí)間

2:實(shí)現(xiàn)密碼錯(cuò)誤次數(shù)超限后鎖定,并提示何時(shí)解鎖

?

CREATE DEFINER=`root`@`%` FUNCTION `uc_session_login`(`reqjson` JSON,`srvjson` JSON ) RETURNS json LANGUAGE SQL NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER COMMENT 'JSON用戶登錄' BEGIN#SELECT `uc_session_login`('{"email":"xxscn@qq.com","pwdmd5":"md5加密后的密碼"}','{"ipaddress":"用戶登錄的IP地址"}')jsonDECLARE retjson JSON DEFAULT'{"errno":0}';#密鑰表DECLARE _keyid INT(10)UNSIGNED;DECLARE _secretkey CHAR(32);#登錄表DECLARE _uid INT(10)UNSIGNED;DECLARE _username VARCHAR(50);DECLARE _password CHAR(32);DECLARE _salt CHAR(6);#地址記錄表DECLARE _failedlogins INT(10)UNSIGNED;DECLARE _beforedel TIMESTAMP;#與字段無關(guān)的輸入DECLARE failedlogins_max INT(10)UNSIGNED DEFAULT 3;#密碼錯(cuò)誤次數(shù)上限DECLARE failedlogins_timeout INT(10)UNSIGNED DEFAULT 20;#時(shí)間范圍內(nèi)清零計(jì)數(shù)DECLARE failedlogins_unlocktime INT(10)UNSIGNED DEFAULT 10;#密碼錯(cuò)誤次數(shù)超限后鎖定時(shí)間#DECLARE srvjson JSON DEFAULT IFNULL(CAST(@srvjson AS CHAR),'{}');#IFNULL(@srvjson,'{}')#已由會(huì)話變量改為函數(shù)的參數(shù)DECLARE secretkey2 VARCHAR(32)DEFAULT IFNULL(srvjson->>'$.secretkey2','');#二級(jí)密鑰DECLARE useripaddress VARCHAR(39)DEFAULT srvjson->>'$.ipaddress';#用戶IP地址DECLARE req_email VARCHAR(50)DEFAULT reqjson->>'$.email';DECLARE req_pwdmd5 CHAR(32)DEFAULT reqjson->>'$.pwdmd5';#與字段無關(guān)的輸出DECLARE json JSON DEFAULT'{}';#首先判斷IP地址是否已被禁止嘗試密碼DELETE FROM uc_session_ipaddress WHERE beforedel<CURRENT_TIMESTAMP();#刪除較早的IPSET _failedlogins=0;SELECT failedlogins,beforedel INTO _failedlogins,_beforedel FROM uc_session_ipaddress WHERE ipaddress=useripaddress;IF _failedlogins>=failedlogins_max THENSET retjson=JSON_SET(retjson,'$.errno',-11);SET retjson=JSON_SET(retjson,'$.message',CONCAT('由于密碼錯(cuò)誤次數(shù)過多,已被鎖定。解鎖時(shí)間:',_beforedel));RETURN retjson;END IF;SELECT uid,username,`password`,salt INTO _uid,_username,_password,_salt FROM uc_members WHERE email=req_email;IF ISNULL(_uid) THEN RETURN '{"error":-1,"message":"您輸入的E-Mail尚未注冊(cè)"}';END IF;IF MD5(CONCAT(req_pwdmd5,_salt))<>_password THENINSERT INTO uc_session_log(uid,ipaddress,errno,error)VALUES(_uid,useripaddress,-2,'登錄密碼錯(cuò)誤');SET @curfailed=_failedlogins+1;IF _failedlogins=0 THEN#第一次密碼錯(cuò)誤INSERT INTO uc_session_ipaddress(ipaddress,failedlogins,beforedel)VALUES(useripaddress,1,TIMESTAMPADD(SECOND,failedlogins_timeout,CURRENT_TIMESTAMP()));ELSEUPDATE uc_session_ipaddress SET failedlogins=@curfailed,beforedel=TIMESTAMPADD(SECOND,failedlogins_unlocktime,CURRENT_TIMESTAMP()) WHERE ipaddress=useripaddress;END IF;IF @curfailed>=failedlogins_max THENSET retjson=JSON_SET(retjson,'$.errno',-3);SET retjson=JSON_SET(retjson,'$.message',CONCAT('由于密碼錯(cuò)誤次數(shù)已達(dá)',failedlogins_max,'次,現(xiàn)已被鎖定',failedlogins_unlocktime,''));RETURN retjson;END IF;SET retjson=JSON_SET(retjson,'$.errno',-2);SET retjson=JSON_SET(retjson,'$.message',CONCAT('您已輸錯(cuò)',@curfailed,'次密碼,如再錯(cuò)',failedlogins_max-@curfailed,'次將被鎖定',failedlogins_unlocktime,''));RETURN retjson;END IF;#登錄校驗(yàn)已通過,開始取得secretkey并出hmacSELECT id,secretkey INTO _keyid,_secretkey FROM uc_session_key WHERE started<CURRENT_TIMESTAMP() AND expired>CURRENT_TIMESTAMP() ORDER BY expired DESC LIMIT 1;IF ISNULL(_keyid) OR ISNULL(_secretkey) THEN RETURN '{"error":-3,"message":"secretkey獲取失敗"}';END IF;SET json=JSON_SET(json,'$.logintime',UNIX_TIMESTAMP(CURRENT_TIMESTAMP(6)));SET json=JSON_SET(json,'$.loginip',useripaddress);SET json=JSON_SET(json,'$.uid',_uid);SET json=JSON_SET(json,'$.email',req_email);SET json=JSON_SET(json,'$.username',_username);SET json=JSON_SET(json,'$.password',_password);SET json=JSON_SET(json,'$.salt',_salt);DELETE FROM uc_session_ipaddress WHERE ipaddress=useripaddress;#刪除較早的IPINSERT INTO uc_session_log(uid,ipaddress,errno,error)VALUES(_uid,useripaddress,0,'登錄成功');SET retjson=JSON_SET(retjson,'$.userjson',CAST(json AS CHAR));SET retjson=JSON_SET(retjson,'$.keyid',_keyid);SET retjson=JSON_SET(retjson,'$.hmacsha1',uc_session_hmacsha1(CONCAT(_secretkey,secretkey2),retjson->>'$.userjson'));SET retjson=JSON_SET(retjson,'$.errno',0);SET retjson=JSON_SET(retjson,'$.message','登錄成功');RETURN retjson; END

?

轉(zhuǎn)載于:https://www.cnblogs.com/xiangxisheng/p/9870827.html

總結(jié)

以上是生活随笔為你收集整理的利用MYSQL的函数实现用户登录功能,进出都是JSON(第一版)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。