有时候你的网站账号被盗或你在别处登录操作后台时,右下角会弹出提示信息,提醒你的账号异地登录,或者会被强制下线。对于这种安全性要求比较高的web网站,很多后台管理都会做这种功能提醒。
甄别自己的账号是否被盗或者是否有另一个人此刻登陆了在进行后台操作,这些都是很不安全的,为了避免两个人同时登录同时操作,可强制下线一个账号。我们今天就来讲解这个知识点。
当然,通过IP判断是不行的,因为IP是随时会在某一个网段内变化的,不过有一个机制,那就是session,恰巧可以解决这个,只要你使用同一个浏览器访问网站,浏览器不关闭每个来访者的session_id是不变的,这也正是解决这个问题需要的。
以TP5.0框架搭建的网站后台为例;用哪个框架都一样
(1)修改数据库用户表
在user表中,增加一个字段`session_id` varchar(32),用来存放登录之后的session_id。
(2)用户登录
用户登录,就是正常的判断账号密码以及验证码,当这些都验证通过的时候,取出当前的session_id存入数据库user表中。
(3)解决异地登录问题 对于后台操作。
为了便于验证和操作安全,基本都会先创建一个公共控制器Common去继承控制器基类,然后后台的其他操作控制器都继承这个公共控制器。对于后台的每一步操作之前,用户状态的检测都放在Common控制器的__construct构造方法中。
现在在__construct构造方法中,除了验证用户登录状态是否被锁定等等,还要取出本地session_id和存放在admin表中的session_id进行比对,如果对不上那么表名账号在异地有登陆,这时候可以迫使强制下线,退回到登录页面。
代码如下:
$user=Db::name('admin')->where('id',session('admin_id'))->find(); $session_id = session_id(); if($user['session_id'] != $session_id){ session_destroy(); $this->error('登录异常,被迫下线', 'Login/index'); }
效果如下:
Login.php核心代码,isGet就显示登录页面,不是就进行登录处理操作。
class Login extends Common { public $is_check_login = false; public function index(){ if($this->request->isGet()){ return $this->fetch(); } //调用自定义的方法实现登录 $model = model('Admin'); $result = $model->login(); if($result === false){ $this->error($model->getError()); } } }
Admin.php,主要是处理上面login的逻辑与处理方法。校验等,不返回false就存入session_id
Common.php公共控制器文件,login继承公共方法,也就是中间件。
意味着登录之前优先通过公共方法,此处接收session_id与存在表里的session_id是否一致,不一致就提醒异地登录,强制下线!
public $is_check_login=true; public $request; public function __contruct(Request $req) { parent::__contruct(); $this->request =$req; if(!session('admin_id') && $this->is_check_login){ $this->error("先去登录",'Login/index'); } if(session('admin_id') && $this->is_check_login){ $user = "select...." //查找存在表里的session_id,然后作比较 if(session('admin_id') != $user['session_id']){ session_destroy(); $this->error("登录异常,被迫下线"); } } }
整个过程思路实现起来很简单!其实就是在讲sesson_id的一个用法!
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/7231/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料