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 相关文章推荐
PHP利用COM对象访问SQLServer、Access
Oct 09 PHP
构建简单的Webmail系统
Oct 09 PHP
php 网页游戏开发入门教程一(webgame+design)
Oct 26 PHP
支持数组的ADDSLASHES的php函数
Feb 16 PHP
PHP实现的简易版图片相似度比较
Jan 07 PHP
php验证码实现代码(3种)
Sep 07 PHP
PHP连接数据库实现注册页面的增删改查操作
Mar 27 PHP
Laravel核心解读之异常处理的实践过程
Feb 24 PHP
PHP实现微信提现(企业付款到零钱)
Aug 01 PHP
Laravel框架创建路由的方法详解
Sep 04 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 24 PHP
TP5多入口设置实例讲解
Dec 15 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
Oracle Faq(Oracle的版本)
2006/10/09 PHP
PHP实现事件机制实例分析
2015/06/26 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
2019/04/17 PHP
最新优化收藏到网摘代码(digg,diigo)
2007/02/07 Javascript
JavaScript访问样式表代码
2010/10/15 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
微信开发之调起摄像头、本地展示图片、上传下载图片实例
2016/12/08 Javascript
Vue.js双向绑定实现原理详解
2016/12/22 Javascript
vue v-model表单控件绑定详解
2017/05/17 Javascript
深究AngularJS中$sce的使用
2017/06/12 Javascript
Express + Node.js实现登录拦截器的实例代码
2017/07/01 Javascript
React-Native中禁用Navigator手势返回的示例代码
2017/09/09 Javascript
Node.js对MongoDB进行增删改查操作的实例代码
2019/04/18 Javascript
JS将指定的某个字符全部转换为其他字符实例代码
2020/10/13 Javascript
[50:28]LGD女子学院第三期 DOTA2复仇之魂教学
2013/12/24 DOTA
[00:12]2018DOTA2亚洲邀请赛SOLO赛 MidOne是否中单第一人?
2018/04/05 DOTA
Python素数检测的方法
2015/05/11 Python
python中利用xml.dom模块解析xml的方法教程
2017/05/24 Python
解决Python网页爬虫之中文乱码问题
2018/05/11 Python
Django项目中包含多个应用时对url的配置方法
2018/05/30 Python
python使用PIL实现多张图片垂直合并
2019/01/15 Python
使用Tensorboard工具查看Loss损失率
2020/02/15 Python
如何在python中判断变量的类型
2020/07/29 Python
web页面录屏实现
2019/02/12 HTML / CSS
高街生活方式全球在线商店:AZBRO
2017/08/26 全球购物
澳大利亚领先的在线机械五金、园艺和存储专家:Edisons
2018/03/24 全球购物
英国浴室洗脸盆购物网站:Click Basin
2018/06/08 全球购物
锐步英国官网:Reebok英国
2019/11/29 全球购物
工程师求职简历的自我评价分享
2013/10/10 职场文书
护士自我介绍信
2014/01/13 职场文书
办理信用卡收入证明范例
2014/09/13 职场文书
婚礼答谢词范文
2015/09/29 职场文书
优秀家长事迹材料(2016推荐版)
2016/02/29 职场文书
Canvas三种动态画圆实现方法说明(小结)
2021/04/16 Javascript
pytorch--之halfTensor的使用详解
2021/05/24 Python
SQL实现LeetCode(196.删除重复邮箱)
2021/08/07 MySQL