PHP 用户登录失败后被锁定限制的功能实现

2021-10-23 12:37:00
admin
原创
2700

使用 PHP 简单实现当用户连续输错密码5次,锁定用户10分钟;连续被锁定3次,封禁用户 IP;如果成功登录,则输错次数和被锁定次数等相关字段清0(默认值)。

用户表部分相关字段:

denied      输错密码次数         默认:0

locked      被锁定次数             默认:0

lockTime  被锁定时间             默认:'0000-00-00 00:00:00'

ip              被锁定的IP             默认:空

主要逻辑代码:

    public function comparePassword($account, $password)
    {
        if(!$account or !$password) return false;
        /* 先通过用户名从数据库中获取该用户记录 */
        $user = $this->dao->select('*')->from('user')
            ->Where('account')->eq($account)
            ->fetch();
        if(!$user) return false;
        // 连续输错密码5次,锁定用户10分钟;连续被锁定3次,封禁用户IP;成功登录,输错次数和被锁定次数清0;
        if($user->ip != '')
        {
            $surrentIP = helper::getRemoteIp();
            if ($surrentIP == $user->ip)
            {
                $this->lang->user->loginFailed = $this->lang->user->banned;
                return false;
            }
            else
            {
                $user->ip = '';
            }
        }
        if($user->lockTime != '0000-00-00 00:00:00')
        {
            $timeDiff = time() - strtotime($user->lockTime);
            if($timeDiff >0 && $timeDiff <= 10*60 ) 
            {
                $this->lang->user->loginFailed = sprintf($this->lang->user->locked, '10');
                $this->dao->update('user')->data($user)->where('id')->eq($user->id)->exec();
                return false;
            }
            else
            {
                $user->denied   = 0;
                $user->lockTime = '0000-00-00 00:00:00';
            }
        }
        // 对比用户输入的密码与数据库存储的密码并更新记录
        $password = md5($password . $user->account);
        if(!($password == $user->password))
        {
            $user->denied ++;
            if($user->denied > 4) 
            {
                $user->lockTime = date('Y-m-d H:i:s', time());
                $user->locked ++;
                if($user->locked > 2)
                {
                    $user->ip = helper::getRemoteIp();
                }
            }
            $this->dao->update('user')->data($user)->where('id')->eq($user->id)->exec();
            return false;
        }
        $user->ip     = '';
        $user->denied = 0;
        $user->locked = 0;
        $user->lockTime = '0000-00-00 00:00:00';
        $this->dao->update('user')->data($user)->where('account')->eq($user->account)->exec();
        return $user;
    }


版权声明

版权声明:本站原创文章,转载请注明作者和出处。

本站点采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议