Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1284|回复: 0

oracle存储过程实现用户尝试登陆失败5次锁定用户24小时

  [复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2013-1-20 18:13:13 | 显示全部楼层 |阅读模式
        假如创建了一个表t_customer,其中字段username为用户名,password为密码,lock_date用户被锁定时间,enable为是否锁定,0未知,1可用, 2不可用,不可空。try_time尝试登陆次数。
      需求如下: 如果一个用户尝试登陆系统5次失败,那么用户将会被锁定24小时。
    创建存储过程如下:
    create or replace procedure UPDATE_CUSTOMER_LOGIN
    (
        username             in    t_customer.username%type,                  ---用户名
        password             in    t_customer.password%type,                  ---孕妇密码.
        nowDate              in    date,                                                                   ---当前时间
        loginFlag            out   varchar2,                                                       --登录标志,1.登录成功,2.用户名不存在,3.用户锁定中,4.用户名正确,密码错误,5.账号已锁定,请24小时后再试
        resultFlag           out   varchar2,                                                      ---1:返回为空,0:返回一条记录,1:返回多条记录
        errorFlag            out   varchar2,                                                     ---0:结果正常,1:发生异常
        returningResultSet   out   P_COMMON_PACKAGE.commonInfo                ---样本信息结果集
    )
    is
        v_username         t_customer.username%type:=username;
        v_password         t_customer.password%type:=password;
        v_nowDate          date:=nowDate;
        v_sql              varchar2(32000);
        v_count            integer;
        v_enable           varchar2(100);
        v_lock_date        Date;
        v_try_time         number;
        v_repasswrod       t_customer.password%type;
      begin
          ---用户id不为空
        if v_username is not null
            then
               ---查询出样品的相关信息
                v_sql:=' select count(*)   from  t_customer  where  username='''||v_username||'''';
                execute immediate v_sql into v_count;
                if v_count>0 then
                    select  t.lock_date,t.try_time,t.enable ,t.password  into v_lock_date, v_try_time,v_enable,v_repasswrod
                    from  t_customer t where  t.username=v_username;
                    ---如果锁定状态为1:可用
                    if  v_enable=1  then
                          --如果数据库中的密码与传入的密码一致,则登陆成功
                          if  v_repasswrod=v_password then
                                  loginFlag:=1;
                                  resultFlag:=0;                         ---1:登录成功
                                  errorFlag:=0;
                                  --设置lock_date为'',try_time为0
                                  update t_customer t set t.lock_date='',t.try_time=0 where t.username=v_username;
                                  open  returningResultSet for select * from  t_customer t where t.username=v_username;
                           --如果数据库中的密码与传入的密码不一致      
                          elsif   v_repasswrod<>v_password  then
                                 --当密码不正确时,判断登陆次数是否小于3。[总共次数为5,默认值为0]
                                 if v_try_time<=3  then
                                      loginFlag:=2;
                                      resultFlag:=-1;                           ---2:密码错误
                                      errorFlag:=0;
                                      --登陆尝试次数加1
                                      update t_customer t set t.try_time=t.try_time+1 where t.username=v_username;
                                 --当密码不正确时,判断登陆次数是否大于等于4。     
                                 elsif  v_try_time>=4  then
                                      --设置登陆尝试次数加1,锁定状态为2:不可用。
                                      update t_customer t set t.try_time=t.try_time+1,t.enable=2 ,t.lock_date=v_nowDate  where t.username=v_username;
                                      loginFlag:=4;
                                      resultFlag:=-1;                           ---4:用户锁定中
                                      errorFlag:=0;
                                 end if;
                          end if;
                    else   
                          --如果锁定状态不为1,也就说用户可能已经锁定。   
                          --如果lock_date不为空,并且用户已经锁定了24小时,则继续验证用户密码。               
                          if  v_lock_date is not null and  v_nowDate is not null and  to_number(v_nowDate-v_lock_date)*24>=24  then
                                --密码正确。
                                if  v_repasswrod=v_password then                                    
                                         loginFlag:=1;
                                         resultFlag:=0;                         ----登录成功
                                         errorFlag:=0;
                                         update t_customer t set t.try_time=0,t.enable=1,t.lock_date=''  where t.username=v_username;
                                         open  returningResultSet for select * from  t_customer t where t.username=v_username;
                                --密码不正确         
                                elsif   v_repasswrod<>v_password  then                                    
                                        loginFlag:=2;
                                        resultFlag:=-1;                         ----2:密码错误
                                        errorFlag:=0;
                                        update t_customer t set t.try_time=1,t.enable=1,t.lock_date=''  where t.username=v_username;
                                        open  returningResultSet for P_COMMON_PACKAGE.GLOBAL_EMPTY_CURSOR;
                               end if;
                          else
                                   loginFlag:=3;
                                   resultFlag:=-1;                              ----3:账号已锁定,请24小时后再试
                                   errorFlag:=0;
                                  open  returningResultSet for P_COMMON_PACKAGE.GLOBAL_EMPTY_CURSOR;
                          end if;
                    end if;
              end if;
        elsif  v_username is  null
               then
                loginFlag:=2;
                resultFlag:=-1;                                                ----2:密码错误
                errorFlag:=0;
                open  returningResultSet for P_COMMON_PACKAGE.GLOBAL_EMPTY_CURSOR;
        end if;
      ---处理异常
    exception
       when NO_DATA_FOUND
            then
            loginFlag:=-1;
            resultFlag:=-1;
            errorFlag:=1;
            open  returningResultSet for P_COMMON_PACKAGE.GLOBAL_EMPTY_CURSOR;
       when others
            then
            loginFlag:=-1;
            resultFlag:=-1;
            errorFlag:=1;
            open  returningResultSet for P_COMMON_PACKAGE.GLOBAL_EMPTY_CURSOR;
    end;

    回复

    使用道具 举报

    该用户从未签到

    发表于 2013-1-20 18:14:10 | 显示全部楼层
    楼主总结不错啊!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2013-1-22 11:13:47 | 显示全部楼层
    不错啊!谢谢楼主。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-1-22 23:03 , Processed in 0.322411 second(s), 37 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表