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


    有时候你的网站账号被盗或你在别处登录操作后台时,右下角会弹出提示信息,提醒你的账号异地登录,或者会被强制下线。对于这种安全性要求比较高的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的一个用法!

    世界上最美的风景,是自己努力的模样
  • 相关阅读:
    轮播闪白效果
    轮播图效果
    打字游戏简约版
    js购物时的放大镜效果
    单例模式
    docker
    【spring】注解梳理
    【spring源码-1】BeanFactory + XMLBeanFactory
    【设计模式】
    【大数据Spark】PC单机Spark开发环境搭建
  • 原文地址:https://www.cnblogs.com/xiong-hua/p/11850605.html
Copyright © 2020-2023  润新知