[email protected]   15826058953
B2B外贸网站建设与运营,WEB服务器运维,始于2016。

thinkphp3.2.3限制后台的账户同一时间只能一台电脑上线

2020-07-05     重庆LiSEO工作室    

本程序目的是模拟当网站后台有多个管理员时,防止意外情况下,密码被多人知道后,就需要限制后台的账户同一时间只能一台电脑上线,其原理很简单:程序实现的思路如下:

1.只需要将登录后的账户的每一个操作时间记录下来,然后在服务器session时间过期之前,就不允许此账户再一次登录即可;

2.但如果已经登录的账户退出后,需要马上再次登录怎么办?上面描述的方法就不足够了,所以在账户登录的时候,还得将账户登录的IP记录下来,目的就是防止已经登录的账户,在注销后,还可以立即再次登录;

登录控制器中代码如下

public function index(){
    if(IS_POST){
        $admin=D('Admin');
        $data=I('post.');
        if($admin->create($data)){
            $where['username']=$data['username'];
            $where['password']=md5($data['password']);
            $result=$admin->where($where)->find();
            if($result){
                $now= time();   //记录账户登录时间
                $ip= get_client_ip();    //记录账户登录IP
                if($result['ip'] != $ip){     //如果此时登录的IP地址与服务器中最后一次保存的IP不一致,就需要验证session超时时间
                    if($now - $result['log_time'] < 1500){ $this->error('此账户在线,请过25分钟后再登录');    //这里设置的超时时间必须大于服务器session过期时间
                    }
                }
                //组合session会话数组
                $login['userid']=$result['id'];
                $login['username']=$data['username'];
                //将session会话数组值赋值给session变量auth
                session('auth',$login);
                $updata['log_time']= time();
                $updata['ip']= $ip; 
                $admin->where($where)->save($updata);
                $this->success('登录成功',U('Index/index'));
            } else {
                $this->error('用户名或密码错误');
            }
        } else {
            $this->error($admin->getError());
        }
    } else {
        $this->display();
    }
}

然后在BaseController.class.php中将账户的每个操作记录下来即可,代码如下:

public function __construct(){
    parent::__construct();
    //检测用户是否拥有登录会话
    if(!session('auth')){
        $this->redirect('Login/index');
    }
    //更新管理员操作时间
    $map['username']=session('auth')['username'];
    $updata['log_time']= time();
    M('Admin')->where($map)->save($updata);
}