先说一下流程:A用A的账号先登录,登录的时候,将用户信息存到session之后,将sessio_id和登录时间存到redis中,B用A的账号登录,同样是将用户信息存到session之后,将sessio_id和登录时间存到redis中,但是这个时候用户A的在redis中的session_id和登录时间已经被改变了,当A再操作页面的时候,会检查session中的session_id和redis中的session_id是不是一样的,如果一样,说明可以正常操作,如果不一样,就会清除session中的session,跳转到登录页面
此致整个流程做完,其实很简单
下面上代码
login.php
$username = $request->param('user_name');
$passqord = md5($request->param('password'));
$res = Db::name('admin')->where(['user_name'=>$username,'password'=>$passqord])->find();
if($res){
$redis = new \Redis();
$redis->connect('12.12.12.12',6379);
$redis->auth('123456');
session('user_name',$username);
$session_id = session_id();
$redis->set("userid".$res['id'],$session_id);
$redis->set("logintime".$res['id'],time());
return $this->success('登录成功','/admin');
}else{
return $this->error('用户名或者密码错误','/login');
}
Base.php:父级控制器
<?php
namespace app\admin\controller;
use think\Controller;
use think\Request;
use think\Db;
class Base extends Controller
{
public function _initialize(){ //_initialize框架自带的函数
if(session('user_name') == null){
$this->redirect('/login');
}else{
$sessionName = session('user_name');
$res = Db::name('admin')->where(['user_name'=>$sessionName])->find();
$redis = new \Redis();
$redis->connect('12.12.12.12',6379);
$redis->auth('123456');
$session_userid = $redis->get("userid".$res['id']);
if($session_userid == session_id()){
$redis->set("logintime".$res['id'],time());
}else{
session('user_name',null);
$this->redirect('/login');
}
}
}
}