ThinkPHP做自动登陆及异位或加密COOKIE!
异位或加密方法:
/* *登陆如果自动登陆加密 *默认是0解密状态,1是加密 *采用的方法是异位或加密 */ function encrytion($value,$type=0){ $key = md5(C('AUTO_LOGIN_KEY')); //加密 if($type){ // 64位加密 //return base64_encode($value ^ $key); // 加密后可能会有等号 return str_replace('=','',base64_encode($value ^ $key)); }; $value = base64_decode($value); return $value ^ $key; }
在Config.php文件中设置异位或加密字段及自动登陆有效时间:
<?php return array( //'配置项'=>'配置值' //异位或加密 'AUTO_LOGIN_KEY' => md5('www.ask.com'), //自动登陆有效时间 'AUTO_LOGIN_TIME' => time() +3600*24*7, 'LV_LOGIN' => 1, );
如果要自动登陆,设置cookie:保存自动登陆账号的ID,IP,和账号:(login控制器)
// 判断下一次是否自动登陆 if(isset($data['auto'])){ $value = $user['id'].'|'.get_client_ip().'|'.$user['username']; //echo $value."<hr>"; // 需要保存的信息 1|127.0.0.1|赵子龙 //进行加密 $value = encrytion($value,1); //echo $value."<br>"; //加密结果 //解密 $val = encrytion($value,0); //echo $val; // 解密结果 // 设置 COOKIE @setcookie('auto',$value,C('AUTO_LOGIN_TIME'),'/'); };
判断COOKIE及自动登陆:
class CommonController extends Controller { Protected function _initialize(){ //if(!C('WEB_STATE')){$this->error('网站正在维护中...');}; //是否自动登陆 //判断是否有COOKIE 且 没有登陆 if(isset($_COOKIE['auto']) && !isset($_SESSION['uid'])){ $value = $_COOKIE['auto']; $value = encrytion($value,0); //echo $value; // 1|127.0.0.1|赵子龙 // 拆成数组 $value = explode('|',$value); if($value[1] == get_client_ip()){ session('uid',$value[0]); session('username',$value[2]); } }; } }
整个控制器:
<?php namespace Home\Controller; use Think\Controller; class CommonController extends Controller { Protected function _initialize(){ //if(!C('WEB_STATE')){$this->error('网站正在维护中...');}; //是否自动登陆 //判断是否有COOKIE 且 没有登陆 if(isset($_COOKIE['auto']) && !isset($_SESSION['uid'])){ $value = $_COOKIE['auto']; $value = encrytion($value,0); //echo $value; // 1|127.0.0.1|后盾网 // 拆成数组 $value = explode('|',$value); if($value[1] == get_client_ip()){ session('uid',$value[0]); session('username',$value[2]); } }; } public function login(){ //if(IS_POST){$this->error('页面不存在');}; $data = I('post.'); //p($data);die; $dataPad = I('post.pwd','','md5'); $db = M('user'); $where = array('account'=>$data['account']); $field = array('id','username','password','logintime','lock'); $user = $db->where($where)->field($field)->find(); if(!$user || $user['password'] != $dataPad){ $this->error('账号或密码错误'); }; // 如果正确就继续往下走 // 判断是否锁定 if(!$user['lock']){ $this->error('账号被锁定'); }; // 判断下一次是否自动登陆 if(isset($data['auto'])){ $value = $user['id'].'|'.get_client_ip().'|'.$user['username']; //echo $value."<hr>"; // 需要保存的信息 1|127.0.0.1|赵子龙 //进行加密 $value = encrytion($value,1); //echo $value."<br>"; //加密结果 //解密 $val = encrytion($value,0); //echo $val; // 解密结果 // 设置 COOKIE @setcookie('auto',$value,C('AUTO_LOGIN_TIME'),'/'); }; //每天登陆增加经验 // 读取它上一次的登陆时间,在和今天的 0点0时0分0秒 对比 如果小就是新登陆 $today = strtotime(date('Y-m-d')); $where = array('id'=>$user['id']); if($user['logintime']<$today){ $db->where($where)->setInc('exp',C('LV_LOGIN')); } //更新时间 $db->where($where)->save(array('logintime'=>time())); //写入到session session('uid',$user['id']); session('username',$user['username']); //从那个页面来就跳转到那个页面去 redirect($_SERVER['HTTP_REFERER']); } //退出登录 Public function logout () { session_unset(); session_destroy(); redirect(__APP__); } }