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); }