A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

phpleon

初级黑马

  • 黑马币:24

  • 帖子:10

  • 精华:0

      当你的网站账号被盗或在别处登录操作后台时,强制下线一个账号并提示“您的账号在其他地方登录,您已经被强制下线”,对于安全性要求比较高的web网站,特别是后台管理,有时候需要甄别自己的账号是否被盗或者是否有另一个人此刻登陆了在进行后台操作,这些都会很不安全,为了避免两个人同时登录同时操作,可强制下线一个账号。
     通过IP判断当然是不行的,因为IP是随时会在某一个网段内变化的,但是有一个机制,恰巧可以解决这个,那就是session,只要使用同一个浏览器访问网站,浏览器不关闭每个来访者的session_id是不变的,这也正是解决这个问题需要的。
以TP5.0框架搭建的网站后台为例;
(1)修改数据库用户表
    在user表中,增加一个字段`session_id`  varchar(32),用来存放登录之后的session_id。
(2)用户登录
    用户登录,就是正常的判断账号密码以及验证码,当这些都验证通过的时候,取出当前的session_id存入数据库user表中。
[PHP] 纯文本查看 复制代码
Db::name('admin')->where('id',$userInfo['id'])->update(['session_id'=>session_id()]);

(3)解决异地登录问题
    对于后台操作,为了便于验证和操作安全,基本都会先创建一个公共控制器Common去继承控制器基类,然后后台的其他操作控制器都继承这个公共控制器。对于后台的每一步操作之前,用户状态的检测都放在Common控制器的__construct构造方法中。
现在在__construct构造方法中,除了验证用户登录状态是否被锁定等等,还要取出本地session_id和存放在admin表中的session_id进行比对,如果对不上那么表名账号在异地有登陆,这时候可以迫使强制下线,退回到登录页面。代码如下:
[PHP] 纯文本查看 复制代码
$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控制器文件
Admin.php模型文件
Common.php公共控制器文件



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马