当前位置: 首页 > article >正文

workman服务端开发模式-应用开发-后端api推送修改一

一、修改后端api登录

        在根目录下app文件夹下controller文件夹下common文件夹下Login.php文件下,修改doLogin方法,代码如下:

//登录
    public function doLogin(){
        $param = $this->request->param();
        $validate = new \app\validate\common\Login;
        $result = $validate->check($param);//参数验证
        if (!$result) return err($validate->getError());
        //验证码的正确性
        if (!app()->make(\Other\Captcha::class)->check($param['captcha_code'])) return err('验证码错误');
        if (time() + 5 < strtotime($param['login_time'])) return err('非法登录');
        $resData = Admin::dataFind(['email' => trim($param['username'])], 'id,realname,password,ip,status', true);
        //用户信息的正确性
        if (empty($resData) && empty($resData['id'])) return err('用户不存在');
        if ($resData['status'] !== 1) return err('该账号已被禁用');
        $systemParam = SystemModel::dataFind(['id' => 1],'security_password,platform_token_expira');
        if ($resData['password'] !== sha1($param['password'] . $systemParam['security_password'])) return err('账号对应的密码错误');
        $loginIp = $this->request->header('x-real-ip');
        if(!empty($resData['ip'])){
            if($resData['ip'] != $loginIp)return err('禁止访问,不在IP白名单中');
        }
        // 获取浏览器版本
        $browserId = Browser::getVersion();
        // 获取该用户是否在登录状态下
        $tokenId = Redis::select(config('cache.stores.redis.token_db'))->get('token_' . $resData['id']);
        // 如果在登录状态下,需要确认IP是否一致
        if(!empty($tokenId)){
            // 读取用户之前登录的IP及浏览器
            $resTokenLogin = TokenModel::dataFind(['token' => $tokenId,'token_type' => 1],'browser_id,login_ip',true);
            // 如果之前登录的IP存在 之前登录的IP与现在登录的IP进行对比
            if(!empty($resTokenLogin)){
                // 如果不相等的情况下,需要告知之前的浏览器做退出动作
                if($loginIp != $resTokenLogin['login_ip']){
                    GatewayWork::getClientIdByUid($resData['id']);
                }else{
                    // 如果相等的情况下,就需要判断浏览器是否相等啦,如果不相等的情况下,也是需要让之前的账号多退出的动作
                    if($browserId != $resTokenLogin['browser_id']){
                        GatewayWork::getClientIdByUid($resData['id']);
                    }
                }
            }
        }
        //写入Token日志
        $data['token_type'] = 1;
        $data['menu_name'] = 'CommonLoginDoLogin';
        $data['admin_id'] = $resData['id'];
        $data['random_number'] = alnum();
        $data['browser_id'] = $browserId;
        $data['login_ip'] = $loginIp;
        $data['create_time'] = date('Y-m-d',strtotime($param['login_time']));
        $data['login_time'] = $param['login_time'];
        $data['expire_time'] = strtotime($param['login_time']) + $systemParam['platform_token_expira'];
        $token = $data['admin_id'] . $data['random_number'];
        $data['token'] = sha1(sha1($token) . strtotime($data['login_time']));
        TokenModel::save($data,[]);
        //加入跨站攻击验证队列
        Redis::select(config('cache.stores.redis.token_db'))->setex('token_' . $data['token'],$systemParam['platform_token_expira'],$resData['id']);
        Redis::select(config('cache.stores.redis.token_db'))->setex('token_' . $resData['id'],$systemParam['platform_token_expira'],Encrypt::encryptRsa($data['token']));
        /*$emailSender = new EmailSender();
        $emailSender::send($param['username'],'登录系统',$resData['realname'].'于'.$param['login_time'].'登录系统');*/
        return succ('登录成功',Encrypt::encryptRsa($token));
    }

二、修改数据库token操作表

        表结构如下:


http://www.kler.cn/a/448345.html

相关文章:

  • Neo4j 图数据库安装与操作指南(以mac为例)
  • 【学习记录】浏览器指纹相关学习记录(指纹介绍、获取指纹、修改指纹、随机指纹保护隐私等)
  • python面试篇-多并发详解(多线程,多进程,协成整理)---一篇搞定
  • Element@2.15.14-tree checkStrictly 状态实现父项联动子项,实现节点自定义编辑、新增、删除功能
  • 分布式系统架构5:限流设计模式
  • 鸿蒙开发(18)arkTS类型
  • leetcode之hot100---48旋转图像(C++)
  • 最新ubuntu20.04安装docker流畅教程
  • 关于UDP缓冲区和丢包统计
  • 前端配置跨域的详细指南
  • ReactPress 1.6.0:重塑博客体验,引领内容创新
  • Go使用sqlx操作MySQL完整指南
  • 【集合】Java 8 - Stream API 17种常用操作与案例详解
  • Vue 单表 CRUD模板 前端
  • LeetCode hot100-93
  • stm32 查找进硬件错误方法
  • 12.19问答解析
  • 常用网络协议简述
  • Java-web安全01
  • Python小游戏开发:实现带道具加成的经典打砖块游戏
  • 【JetPack】WorkManager笔记
  • Java 集合框架中的 List、ArrayList 和 泛型 实例
  • 数据库的范式
  • 学技术学英文:java CyclicBarrier 和 CountDownLatch用法区别,举例生动看完不会忘
  • Unity中通过代码设置材质HDR颜色的方法参考
  • opencv 项目--图像匹配