户大家自己试下。 意会下
phpcms_auth() 是加密和解密 函数, 因为cookie 是存在于客户端。十分危险呀。 你看连用户的密码也存在cookie 不加密能行吗。但是呢加密后又要能解密。因为用户名和用户密码我们往下操作要
获取的。 这个函数存在于 global.func.php 文件里面。大家想了解这个算法的自己去看下吧。挺简单的。 其实就是围绕着 $phpcms_auth_key 这个变量来加密解密和discuz 的cookie 机制差不。
$phpcms_auth_key = md5($PHPCMS['authkey'].$_SERVER['HTTP_USER_AGENT']); 看$PHPCMS['authkey'],估计后台有个 cookie 加密值让你填,然后以这个值和 $_SERVER['HTTP_USER_AGENT'](系统信息)
*/
$_userid = intval($_userid);
if($_userid < 0) $_userid = 0; //读出的cookie 的用户id 如果是 小于0
if($_userid) //如果 cookie 保存的这个uid 存在,那么开始按照这个ID来查数据库用户表 来取出用户信息
{
$memberinfo = $db->get_one("SELECT username,password,groupid,arrgroupid,email,chargetype,begindate,enddate,money,point,credit,newmessages FROM ".TABLE_MEMBER." WHERE userid=$_userid LIMIT 0,1");
/**
phpcms 封装好的数据库类,下篇开讲这个大家就大概看行了。 大家看下 select sql语句。 也可以学习下。 首先最好不要使用 select * from xx 的 * 形式,除非你想获取所有字段的记录。只罗列你要的字段。这样在数据量大的查询中。速度明显上去。 常量: TABLE_MEMBER 定义了表名。这样做有什么好处呢?想都知道了,为了以后变更表名方便而定义为常量。这个东西那里来的。估计在一个文件里面定义好的。遇到了再讲吧懒得找了。
*/
if($memberinfo && $memberinfo['password'] == $_password) //用查询出来的密码和 cookie 中存在的密码想对比.为了在效率: 在比较前 先判断查询是否成功先。很多phper往往忽略。
{
if($memberinfo['groupid'] == 2) //如果用户属于的组的ID 为 2 那么这个用户是被管理员禁止访问的了。
{
mkcookie('auth', ''); // 清除cookie
showmessage($LANG['userid_banned_by_administrator']); //提示出错菜单
}
@extract($memberinfo, EXTR_PREFIX_ALL, ''); //又来这招,应该明白了吧各位老大:把字段 变成 我们能直接使用的变量
unset($memberinfo, $_password, $_answer);
$_arrgroupid = $_arrgroupid ? array_filter(explode(',', $_arrgroupid)) : array(); //把 字段为 arrgroupid 值为 FALSE 过滤掉。array_filter()不带回调参数的用法,请看手册。
}
else
{
mkcookie('auth', '');
}
/**
经过上面的读cookie 和查数据库用户信息后。当确定这个用户信息是合法以后。就会自动登陆了。比如phpchina论坛。当你登陆后没注销。下次访问的时候还是登陆状态。就是这个原理。记得模仿哦
这里详细解释下 mkcookie ()函数 上菜:
function mkcookie($var, $value = '', $time = 0)
{
global $CONFIG,$PHP_TIME;
$time = $time > 0 ? $time : (empty($value) ? $PHP_TIME - 3600 : 0);
$s = $_SERVER['SERVER_PORT'] == '443' ? 1 : 0;
$var = $CONFIG['cookiepre'].$var;
return setcookie($var, $value, $time, $CONFIG['cookiepath'], $CONFIG['cookiedomain'], $s);
}
$time 为cookie 的存活时间: 如果为 0 就是关闭浏览器 cookie 就自动失效 , $PHP_TIME 在前面定义了:当前时间。 $PHP_TIME -3600 减去3600秒。就是一个小时前的意思,那肯定是设置cookie 失效的意思了。
$s 变量是 获取 是否开启SSL安全传输的标致。 cookie 有一个参数是ssl传输的。如果服务器已经opensll 了那么我们肯定不能浪费这么好的安全资源了。
$var cookie名的前缀,主要防止混淆。
$CONFIG['cookiedomain'] 这个家伙在 config.inc.php里面已经配置的了。定义为: '/' 意思就是说 在当前域 的所有目录的PHP程序都能访问这个COOKIE ,还有限制目录访问COOKIE 的弄法。具体请看 setcookie () 函数手册上说明。
*/
}
}
unset($db_class, $db_file, $phpcms_auth, $phpcms_auth_key, $memberinfo);
下章我就分析 PHPCMS 的数据库操作类文件和 PHPCMS的文本缓存机制. 希望大家继续支持哦第一