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这个东西,所以今天有时间开始分析其原代码。

取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

Powered by bytekits.com,汇天下文字,成非凡梦想!!!