dedecms5.7原代码分析 用户登录
用户的登录:分离变量
用户通过dede/login.php提交登录信息给dede/login.ph后,先是引入comm.inc.php,初始化全局参数,调用下面的函数进分变量分离
foreach(Array('_GET','_POST','_COOKIE') as $_request)
{
foreach($$_request as $_k => $_v)
{
if($_k == 'nvarname') ${$_k} = $_v;
else ${$_k} = _RunMagicQuotes($_v);
}
}
这里涉及一个大括号的用法,就是把用户提交的key转化成名变,内容就是提交的内容,有人解释的很经 典,直接引用:
这个目的就是取出$_GET,$_POST,$_COOKIE
这三个数组里面的值,并且根据这三个数组自身的下标定义变量,后面书写直接就用这个变量就行了。
举个例子,比如现在用户注册提交了一个用户名$_POST['username']='旺财'
;
那么经过这个循环就会创建一个新变量$username,并且值也是 ‘小强’ ;
后面想用这个值直接用$username,
而不必再写$_POST['username']
;
目的应该是为了简化书写,所以你看织梦后面的代码,通篇都看不到$_GET,$_POST的字眼,原因就在这里
自己照猫画虎也弄一个:
<?php
$value["Name"] = "tingchen";
$value["Sex"] = "mail";
foreach($value as $key =>$v)
{
${$key} = $v;
}
echo $Name;
?>
用户的登录:用户验证
根据提交类型$dopost==”login”进行用户验证,身份验证是通过一个类inclue/usrerlogin_class.php类实现的,系统默认开启Session,初始化时根据Session数组的dede_admin_id键是否设置进行初始化,
function __construct($admindir='')
{
global $admin_path;
if(isset($_SESSION[$this->keepUserIDTag]))
{
$this->userID = $_SESSION[$this->keepUserIDTag];
$this->userType = $_SESSION[$this->keepUserTypeTag];
$this->userChannel = $_SESSION[$this->keepUserChannelTag];
$this->userName = $_SESSION[$this->keepUserNameTag];
$this->userPurview = $_SESSION[$this->keepUserPurviewTag];
$this->adminStyle = $_SESSION[$this->keepAdminStyleTag];
}
else
{
echo "no keepUserIDTag";
}
if($admindir!='')
{
$this->adminDir = $admindir;
}
else
{
$this->adminDir = $admin_path;
}
}
调用usrerlogin_class类的checkUser($userid,$pwd);方法进行验证
function checkUser($username, $userpwd)
{
global $dsql;
//只允许用户名和密码用0-9,a-z,A-Z,'@','_','.','-'这些字符
$this->userName = preg_replace("/[^0-9a-zA-Z_@!.-]/", '', $username);
$this->userPwd = preg_replace("/[^0-9a-zA-Z_@!.-]/", '', $userpwd);
$pwd = substr(md5($this->userPwd), 5, 20);
$dsql->SetQuery("SELECT admin.*,atype.purviews FROM `#@__admin` admin LEFT JOIN `#@__admintype` atype ON atype.rank=admin.usertype WHERE admin.userid LIKE '".$this->userName."' LIMIT 0,1");
$dsql->Execute();
$row = $dsql->GetObject();
if(!isset($row->pwd))
{
return -1;
}
else if($pwd!=$row->pwd)
{
return -2;
}
else
{
$loginip = GetIP();
$this->userID = $row->id;
$this->userType = $row->usertype;
$this->userChannel = $row->typeid;
$this->userName = $row->uname;
$this->userPurview = $row->purviews;
$inquery = "UPDATE `#@__admin` SET loginip='$loginip',logintime='".time()."' WHERE id='".$row->id."'";
$dsql->ExecuteNoneQuery($inquery);
$sql = "UPDATE #@__member SET logintime=".time().", loginip='$loginip' WHERE mid=".$row->id;
$dsql->ExecuteNoneQuery($sql);
return 1;
}
}
成功返回1,否则根据情况返回不同的户失败
成功后,再调用$cuserLogin->keepUser();对其进行用户在线保持,有要是设置Session 数组和客户端的Cookie
function keepUser()
{
if($this->userID != '' && $this->userType != '')
{
global $admincachefile,$adminstyle;
if(empty($adminstyle))
$adminstyle = 'dedecms';
@session_register($this->keepUserIDTag);
$_SESSION[$this->keepUserIDTag] = $this->userID;
@session_register($this->keepUserTypeTag);
$_SESSION[$this->keepUserTypeTag] = $this->userType;
@session_register($this->keepUserChannelTag);
$_SESSION[$this->keepUserChannelTag] = $this->userChannel;
@session_register($this->keepUserNameTag);
$_SESSION[$this->keepUserNameTag] = $this->userName;
@session_register($this->keepUserPurviewTag);
$_SESSION[$this->keepUserPurviewTag] = $this->userPurview;
@session_register($this->keepAdminStyleTag);
$_SESSION[$this->keepAdminStyleTag] = $adminstyle;
PutCookie('DedeUserID', $this->userID, 3600 * 24, '/');
PutCookie('DedeLoginTime', time(), 3600 * 24, '/');
$this->ReWriteAdminChannel();
return 1;
}
else
{
return -1;
}
}
如果一切OK,返回用户主页
题外话:
学网页设计也有好多年了,都是一个人在弄,
自己想成啥想的,就弄成啥想的,身边的也没有人来交流,郁闷( ˇ?ˇ )
最近为了弄这个网站,学习了一点静态化的知识,自己也弄了一个后台,本想放开手大干地场,可无奈发现要做的东西太多,自己又没有多余的时间。
一天又发现了这个站点没被收录,所以就了解了一下SEO的东西,在中国站长上逛了一下,学习了一点东西,就逛别人的网站,有天突然看到一个关于美网的网站,
设计的真心不错,还是响应式布局,把我闪的满天星星。。。
但就是有个很奇怪的事情,该网站下的所以网页都放在一个a的目录下,自己也在心里想,难到现在写网站的人起名都是这么随意么…
晚上回到家,又搜了一些关于jsonp,响应式布局的内容,看了看
后来要睡觉了看到一个人说的关于织梦静态化的教程,点进去看了一集,原来是这样的哦,匆忙地看了一个多小时,3点了,要睡了,明天还要上班了啊
反正我记住了,就是dedecms这个东西,所以今天有时间开始分析其原代码。