将用户信息保存至COOKIES中。
用户信息包括:UID,USERNAME,EMAIL,PASSWORD。
其中 EMAIL,PASSWORD进行可逆加密。
每次登录只须将COOKIES进行一次可逆加密和你数据库对比一次若相等则登录,否则进行正常的登录操作。
===============
PS
======================
关于cookies中是否可以存放用户信息,一直都是业界存在争议的一点。
目前我的解决方法是:
cookies中存放有关于邮箱、QQ号码、用户密码、用户名等信息均需要进行可逆加密。
如有用户信息:array("uid"=>1,"username"=>"b","password"=>"1234567","email"=>"abc@abc.com");
那么,我将uid,username,password,email等信息分别存放与cookies中,并且将username,password,email通过key(key只能自己知道和设置)进行可逆加密。当每一次需要操作的时候,我只需要$_COOKIE['password']然后将其解密还原为原始的1234567即可,然后将其进行查询匹配。若查询相同则认为该COOKIES有效,若不匹配则删除cookies。
那么,解密之后查询认证有两种方法:
1.直接连接数据库进行SQL查询,这是一种消耗性能的低效方法。select username,uid,password from xxxx where uid='xxxx',username='xxxxx' LIMIT 1;
这种方法没操作一次需要进行一次SQL查询,将大大增加性能开销。
2.将用户第一次登录查询出来的信息加密保存在cookies的同时,copy保存一份至memcached内存中,并增加标识 uid_status(可自取) 为 1 (登录状态),每一个用户拥有一个唯一的uid_status,并且设置为长期有效。
判断是否登录的过程则更加高效和快速。
将cookies中的信息解密之后,查看uid_status的状态,若为1,直接认定该用户处于登录状态,不删除cookies信息。若为0,非登录状态,则将cookies和memcached中的用户信息进行匹配。匹配包括:password,uid,username。若其中一项不正确则删除cookies,更新uid_status状态。
以上就是我判断用户是否登录过程。
========
P.S
===========
DISCUZ!系列是采用cookies加密后直接查询数据库进行cookies有效判断的。
uc_home核心代码是:<?php
//判断当前用户登录状态
function checkauth() {
global $_SGLOBAL, $_SC, $_SCONFIG, $_SCOOKIE, $_SN;
if($_SGLOBAL['mobile'] && $_GET['m_auth']) $_SCOOKIE['auth'] = $_GET['m_auth'];
if($_SCOOKIE['auth']) {
@list($password, $uid) = explode("\t", authcode($_SCOOKIE['auth'], 'DECODE'));
$_SGLOBAL['supe_uid'] = intval($uid);
if($password && $_SGLOBAL['supe_uid']) {
$query = $_SGLOBAL['db']->query("SELECT * FROM ".tname('session')." WHERE uid='$_SGLOBAL[supe_uid]'");
if($member = $_SGLOBAL['db']->fetch_array($query)) {
if($member['password'] == $password) {
$_SGLOBAL['supe_username'] = addslashes($member['username']);
$_SGLOBAL['session'] = $member;
} else {
$_SGLOBAL['supe_uid'] = 0;
}
} else {
$query = $_SGLOBAL['db']->query("SELECT * FROM ".tname('member')." WHERE uid='$_SGLOBAL[supe_uid]'");
if($member = $_SGLOBAL['db']->fetch_array($query)) {
if($member['password'] == $password) {
$_SGLOBAL['supe_username'] = addslashes($member['username']);
$session = array('uid' => $_SGLOBAL['supe_uid'], 'username' => $_SGLOBAL['supe_username'], 'password' => $password);
include_once(S_ROOT.'./source/function_space.php');
insertsession($session);//登录
} else {
$_SGLOBAL['supe_uid'] = 0;
}
} else {
$_SGLOBAL['supe_uid'] = 0;
}
}
}
}
if(empty($_SGLOBAL['supe_uid'])) {
clearcookie();
} else {
$_SGLOBAL['username'] = $member['username'];
if($_SGLOBAL['connect']) {
cloud_token();
}
}
}
?>