以HMAC密钥形式发放密钥令牌

功能如下

1:记录用户的登录的IP地址、时间

2:实现密码错误次数超限后锁定,并提示何时解锁

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;#与字段无关的输入DECLARE failedlogins_max INT(10)UNSIGNED DEFAULT 3;#密码错误次数上限DECLARE failedlogins_timeout INT(10)UNSIGNED DEFAULT 20;#时间范围内清零计数DECLARE failedlogins_unlocktime INT(10)UNSIGNED DEFAULT 10;#密码错误次数超限后锁定时间#DECLARE srvjson JSON DEFAULT IFNULL(CAST(@srvjson AS CHAR),'{}');#IFNULL(@srvjson,'{}')#已由会话变量改为函数的参数DECLARE secretkey2 VARCHAR(32)DEFAULT IFNULL(srvjson->>'$.secretkey2','');#二级密钥DECLARE useripaddress VARCHAR(39)DEFAULT srvjson->>'$.ipaddress';#用户IP地址DECLARE req_email VARCHAR(50)DEFAULT reqjson->>'$.email';DECLARE req_pwdmd5 CHAR(32)DEFAULT reqjson->>'$.pwdmd5';#与字段无关的输出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('由于密码错误次数过多,已被锁定。解锁时间:',_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尚未注册"}';END IF;IF MD5(CONCAT(req_pwdmd5,_salt))<>_password THENINSERT INTO uc_session_log(uid,ipaddress,errno,error)VALUES(_uid,useripaddress,-2,'登录密码错误');SET @curfailed=_failedlogins+1;IF _failedlogins=0 THEN#第一次密码错误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('由于密码错误次数已达',failedlogins_max,'次,现已被锁定',failedlogins_unlocktime,'秒'));RETURN retjson;END IF;SET retjson=JSON_SET(retjson,'$.errno',-2);SET retjson=JSON_SET(retjson,'$.message',CONCAT('您已输错',@curfailed,'次密码,如再错',failedlogins_max-@curfailed,'次将被锁定',failedlogins_unlocktime,'秒'));RETURN retjson;END IF;#登录校验已通过,开始取得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

转载于:https://www.cnblogs.com/xiangxisheng/p/9870827.html

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

  1. mysql flask-login_Flask框架通过Flask_login实现用户登录功能示例

    本文实例讲述了Flask框架通过Flask_login实现用户登录功能.分享给大家供大家参考,具体如下: 通过Flask_Login实现用户验证登录,并通过login_required装饰器来判断用户 ...

  2. php mysql用户登录_php mysql实现用户登录功能的代码示例

    接着上次的php mysql添加用户的功能代码,今天来学习下php实现用户登录与注销的功能,通过跟踪session会话来保存用户的登陆状态. 1,登录页面 login.php 用户登录_www.# 用 ...

  3. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)--创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)--使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  4. Vue + Spring Boot 学习笔记02:引入数据库实现用户登录功能

    Vue + Spring Boot 学习笔记02:引入数据库实现用户登录功能 在学习笔记01里,我们利用跨域打通了前端的Vue与后端的Spring Boot,实现了用户登录功能,但是后台的登录控制器在 ...

  5. java 记录用户_JavaWeb学习记录(六)——用户登录功能

    使用JDBC.spring框架.servlet实现一个简单的用户登录功能. 一.mySql数据库 SET FOREIGN_KEY_CHECKS=0; -- ---------------------- ...

  6. 【笑小枫的SpringBoot系列】【九】SpringBoot用户登录功能实现

    关于本文 其实用户登录拦截的这块不想这么早写,加个登录后面好多东西就要考虑登录状态了,我其实想把这个系列写成非必要关系,解耦性比较强的系列.但是,写完redis,总是感觉登录是对它最简单的实践,那就加 ...

  7. 使用vue-cli+element-ui+expsess+mysql做一个简易的登录功能

    使用vue-cli+element-ui+expsess+mysql做一个简易的登录功能 1使用webpack下载vue模板 vue init webpack aaa(aaa为项目名称) cd到aaa ...

  8. Apache Shiro实现用户登录功能

    apache shiro实现用户登录功能 配置shiro的Filter实现URL级别权限控制 配置web.xml <!-- shiro的过滤器 --> <filter>< ...

  9. PHP用户登录功能实现

    PHP用户登录功能实现 设计数据库连接,简单查询,表单提交,直接上代码,大家很容易明白. 我建了一个很简单的数据库,表单包括用户名,ID,密码. 用户登录界面 <html><head ...

最新文章

  1. 你知道Redis可以实现延迟队列吗?
  2. webpack 相关文章
  3. 一个微软面试题--关于位结构体
  4. java ui自动化测试脚本,如何用Airtest编写UI自动化脚本(示例代码)
  5. JsTree实现简单的CRUD
  6. Jquery Ui AutoComplete自动填写的功能
  7. 在Android中运用RxJava
  8. 数据处理——数据编码
  9. 《PHP精粹:编写高效PHP代码》——2.7节设计数据库
  10. python中快速删除实例对象中的所有属性
  11. 每天都在和Maven打交道?你真的了解它吗?
  12. 用梯度下降求解最小二乘线性回归python实现
  13. jdk中运行java程序的工具,采用JDK工具编译运行java程序
  14. 免费下载道客巴巴文档的方法
  15. DM6437 720P调试问题记录
  16. 论文阅读笔记——野外和非侵入性遗传方法评估棕熊种群规模
  17. vue 高德获取当前经纬度
  18. 前端实现GIF图片压缩上传
  19. Mysql黑马学习笔记
  20. 阿里巴巴集团--软件测试--《社招、校招jd、公司具体介绍,校园招聘公告,应届生招聘流程,技术培训,薪资福利》整理

热门文章

  1. 沙老师的作业系列——Crudd‘s Crack Head
  2. java怎样实现自定义过滤关键词_SpringSecurity学习之自定义过滤器的实现代码
  3. x265-common.h
  4. x265-确定slice type-2
  5. 使用内置的Gallery应用程序选择图形
  6. 如何在word文档中添加附件
  7. log4j.rootLogger 与log4j.rootCategory 有什么区别 .
  8. jquery常用功能
  9. Hadoop基本流程与应用开发
  10. layui 单选框、复选框、下拉菜单 不显示问题 记录