PHP实现用户异地登录提醒功能的方法

有时候你的网站账号被盗或你在别处登录操作后台时,右下角会弹出提示信息,提醒你的账号异地登录,或者会被强制下线。对于这种安全性要求比较高的web网站,很多后台管理都会做这种功能提醒。

 

甄别自己的账号是否被盗或者是否有另一个人此刻登陆了在进行后台操作,这些都是很不安全的,为了避免两个人同时登录同时操作,可强制下线一个账号。我们今天就来讲解这个知识点。当然,通过IP判断是不行的,因为IP是随时会在某一个网段内变化的,不过有一个机制,那就是session,恰巧可以解决这个,只要你使用同一个浏览器访问网站,浏览器不关闭每个来访者的session_id是不变的,这也正是解决这个问题需要的。

 

以TP5.0框架搭建的网站后台为例;用哪各框架都一样

(1)修改数据库用户表

在user表中,增加一个字段`session_id`  varchar(32),用来存放登录之后的session_id。

(2)用户登录

用户登录,就是正常的判断账号密码以及验证码,当这些都验证通过的时候,取出当前的session_id存入数据库user表中。

Db::name('admin')->where('id',$userInfo['id'])->update(['session_id'=>session_id()]);

 

(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的一个用法!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值