tp5框架使用cookie加密算法实现登录功能示例


Posted in PHP onFebruary 10, 2020

本文实例讲述了tp5框架使用cookie加密算法实现登录功能。分享给大家供大家参考,具体如下:

首先,我们为什么要对cookie加密?

之所以要对cookie加密是以为cookie是保存在客户端的,稍微懂一点技术的人都能找到cookie的保存位置,如果我们保存cookie的时候没有加密,而是明文保存的话也就是说我们的用户名和密码就完全暴露了,这是一个非常大的安全隐患,所以必须加密cookie。

其次,我们不管要对cookie加密,还要考虑到当我们使用的时候要对加密后的cookie进行解密处理,得到正确的用户名和密码后才能做自动登录一类的功能,下面看看我们的加密方案:

1:在配置文件config中添加

'encryption_key'     =>'d441d33a65d31dbf0a8016a85c71a5b3',

tp5框架使用cookie加密算法实现登录功能示例

2:在common文件中添加

tp5框架使用cookie加密算法实现登录功能示例

//type 0:加密 1:解密
function encryption($value,$type=0){
  $key=config('encryption_key');
  if($type == 0){//加密
   return str_replace('=', '', base64_encode($value ^ $key));
  }else{
   $value=base64_decode($value);
   return $value ^ $key;
  }
}

3:在模型中加密代码

public function login($data,$type=0){
    $userData=array();
    $userData['username']=trim($data['username']);
    $userData['password']=md5($data['password']);
    //验证用户名或邮箱或手机号是否存在
    $users=db('user')->where(array('username'=>$userData['username']))->whereOr(array('email'=>$userData['username']))->whereOr(array('mobile_phone'=>$userData['username']))->find();
    // dump($users); die;
    if($users){
      if($users['password'] == $userData['password']){
        session('uid',$users['id']);
        session('username',$users['username']);
        //写入会员等级及折扣率
        $points=$users['points'];
        $memberLevel=db('member_level')->where('bom_point','<=',$points)->where('top_point','>=',$points)->find();
        session('level_id',$memberLevel['id']);//等级id
        session('level_rate',$memberLevel['rate']);//等级折扣率
        //写入cookie
        if(isset($data['remember'])){
          $aMonth=30*24*60*60;
          $username=encryption($users['username'],0);
          $password=encryption($data['password'],0);
          cookie('username', $username, $aMonth, '/');
          cookie('password', $password, $aMonth, '/');
        }
        $arr=[
          'error'=>0,
          'message'=>"",
        ];
        if($type == 1){
          return $arr;
        }else{
          return json($arr);
        }
      }else{
        $arr=[
        'error'=>1,
        'message'=>"<i class='iconfont icon-minus-sign'></i>用户名或者密码错误",
        'url'=>'',
        ];
        if($type == 1){
          return $arr;
        }else{
          return json($arr);
        }
      }
    }else{
      $arr=[
      'error'=>1,
      'message'=>"<i class='iconfont icon-minus-sign'></i>用户名或者密码错误",
      'url'=>'',
      ];
      if($type == 1){
        return $arr;
      }else{
        return json($arr);
      }
    }
  }

4:在控制器中解密代码

public function checkLogin(){
    $uid=session('uid');
    if($uid){
      $arr['error']=0;
      $arr['uid']=$uid;
      $arr['username']=session('username');
      return json($arr);
    }else{
      if(cookie('username') && cookie('password')){
        $data['username']=encryption(cookie('username'),1);
        $data['password']=encryption(cookie('password'),1);
        $loginRes=model('user')->login($data,1);
        if($loginRes['error'] == 0){
          $arr['error']=0;
          $arr['uid']=$uid;
          $arr['username']=session('username');
          return json($arr);
        }
      }
      $arr=array();
      $arr['error']=1;
      return json($arr);
    }
  }

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
构建简单的Webmail系统
Oct 09 PHP
php header()函数使用说明
Jul 10 PHP
PHP入门学习笔记之一
Oct 12 PHP
在php和MySql中计算时间差的方法
Apr 22 PHP
常用的PHP数据库操作方法(MYSQL版)
Jun 08 PHP
解析获取优酷视频真实下载地址的PHP源代码
Jun 26 PHP
ThinkPHP无限级分类原理实现留言与回复功能实例
Oct 31 PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
May 12 PHP
php实现通过soap调用.Net的WebService asmx文件
Feb 27 PHP
php生成毫秒时间戳的实例讲解
Sep 22 PHP
php通过各种函数判断0和空
Jul 04 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
Feb 22 PHP
ThinkPHP5.1+Ajax实现的无刷新分页功能示例
Feb 10 #PHP
ThinkPHP5&amp;5.1实现验证码的生成、使用及点击刷新功能示例
Feb 07 #PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
Feb 07 #PHP
PHP查找一列有序数组是否包含某值的方法
Feb 07 #PHP
php测试kafka项目示例
Feb 06 #PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
Feb 06 #PHP
PHP实现常用排序算法的方法
Feb 05 #PHP
You might like
玛琪朵 Macchiato
2021/03/03 咖啡文化
PHP连接MYSQL数据库实例代码
2016/01/20 PHP
YII中Ueditor富文本编辑器文件和图片上传的配置图文教程
2017/03/15 PHP
PHP不使用内置函数实现字符串转整型的方法示例
2017/07/03 PHP
Thinkphp5结合layer弹窗定制操作结果页面
2017/07/07 PHP
自定义Laravel (monolog)日志位置,并增加请求ID的实现
2019/10/17 PHP
编写高性能的JavaScript 脚本的加载与执行
2010/04/19 Javascript
javascript 另一种图片滚动切换效果思路
2012/04/20 Javascript
jQuery-serialize()输出序列化form表单值的方法
2012/12/26 Javascript
JS获取键盘上任意按键的值(实例代码)
2013/11/12 Javascript
jQuery基本选择器之标签名选择器
2016/09/03 Javascript
微信小程序 本地存储及登录页面处理实例详解
2017/01/11 Javascript
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法
2017/02/08 Javascript
Vue实现数字输入框中分割手机号码的示例
2017/10/10 Javascript
JavaScript实现抖音罗盘时钟
2019/10/11 Javascript
解决Element中el-date-picker组件不回填的情况
2020/11/07 Javascript
[45:18]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第一场
2018/04/04 DOTA
Python bsddb模块操作Berkeley DB数据库介绍
2015/04/08 Python
Python实现向服务器请求压缩数据及解压缩数据的方法示例
2017/06/09 Python
Python排序搜索基本算法之选择排序实例分析
2017/12/09 Python
详解Python 正则表达式模块
2018/11/05 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
2019/08/27 Python
python实现H2O中的随机森林算法介绍及其项目实战
2019/08/29 Python
Python如何定义接口和抽象类
2020/07/28 Python
Python爬虫入门教程01之爬取豆瓣Top电影
2021/01/24 Python
Pycharm制作搞怪弹窗的实现代码
2021/02/19 Python
CSS3 filter(滤镜)实现网页灰色或者黑色模式的代码
2020/11/30 HTML / CSS
圣彼得堡鲜花配送:Semicvetic
2020/09/15 全球购物
财务人员个人求职信范文
2013/12/04 职场文书
《手指教学》反思
2014/02/14 职场文书
小学校长先进事迹材料
2014/05/13 职场文书
动画设计系毕业生求职信
2014/07/15 职场文书
合作协议书范本
2014/10/25 职场文书
建筑技术负责人岗位职责
2015/04/13 职场文书
Python+Selenium实现读取网易邮箱验证码
2022/03/13 Python
Redis基本数据类型哈希Hash常用操作命令
2022/06/01 Redis