这段时间一直在学习ThinkPHP3.2.3,还是有习惯记笔记,写成博客的习惯,方便自己以后查找,也方便其他人学习嘛。

前面备案关站也没记,还好都是些基础,TP手册上都很清楚,记笔记最主要的是记录下业务流程和业务逻辑,年纪大了记性不好。

ThinkPHP3.2.3后台登录验证,主要涉及Verify(),session(),getBy(),redirect()等几个方法。

登录页需要有个验证码,防止各种恶意刷新和登录。

//生成验证码
public function VerifyImg (){
    //设置验证码相关参数
    $config = array(
        'fontSize'  =>  16,              // 验证码字体大小(px)
        'imageH'    =>  30,               // 验证码图片高度
        'imageW'    =>  110,               // 验证码图片宽度
        'length'    =>  4,               // 验证码位数
        );
    //实例化Verify,同时还有命名空间的问题,并传递配置参数
    $Verify = new \Think\Verify($config);
    //输出验证码
    $Verify->entry();
}

在相对应的控制器里面,做个生成验证码的方法,$config里的配置信息,可以在TP目录Thinkphp/Library/Think/Verify.class.php里面看到,具体的解释在官方的手册里也有说,反正这个可以随意搞。

有了验证码,还需要校验登录页提交的用户名和密码是否正确,这个在当前项目模型目Model下做一个数据库模型。

class ManagerModel extends Model{
    //检查用户名和密码是否正确
    //先校验用户名是否存在,再根据用户名校验密码是否正确,防止SQL注入
    public function checkUserPass ($username,$password){    //根据传入$username,$password两个参数
        //校验用户名
        $info = $this->getBymg_name($username);    //getBy动态查询,getBy+数据表名称(查询内容),如果返回NULL说明没有用户名
        //判断用户名是否存在
        if ($info == null){
            return flase;    //如果用户名不存在,返回flase
        }else {    //如果用户名正确,继续校验密码
            //校验密码
            if ($info['mg_pwd'] != $password){
                return flase;    //如果提交的密码和数据库里的密码不一样flase
            }else {
                return $info;    //如果密码正常,返回$info的信息
            }
        }
    }
}

有了用户名密码和验证码的校验后,可以在登录页做相应的校验。

//用户登录
public function login (){
    if (!empty($_POST)){    //判断用户是否提交数据
        $Verify = new \Think\Verify();
        $str = $Verify->check($_POST['captcha']);    //验证用户提交的验证码是否正确
        if ($str){    //判断验证码是否正确
            //验证数据库中的用户名和密码是否正确
            $info = new \Model\ManagerModel;    //实例化ManagerModel模型
            $str = $info -> checkUserPass($_POST['admin_user'],$_POST['admin_psd']);    //使用checkUserPass方法,并传入这两个参数
            if ($str !== flase){    //如果返回的不是flase,则说明用户名和密码校验成功
                //设置session信息
                session('username',$str['mg_name']);
                session('userid',$str['mg_id']);    //为了安全设置个ID,不设置密码
                $this -> redirect('Index/index');    //redirect($url,$time,$msg)调整方法
            }else {
                $error = "用户名或密码错误";
                $this->assign('error',$error);
                $this->display();
            }
        }else {    //不正常输出错误,显示模板
            $error = "验证码错误";
            $this->assign('error',$error);
            $this->display();
        }
    }else {    //没有内容输出空模板
    $this->display();
    }
}

有了各种判断的控制器,就可以把相应的错误信息和session信息输出到相应的模板里面。
登录页面,输出错误信息。

<div style="color:red;">{$error}</div>

同时,在模板里面可以这样子来生成做好的验证码

<img src="__CONTROLLER__/VerifyImg"  alt="" />

我控制器里面$this->assign('error',$error);设置了两个错误信息,所以在有错误的时候也会根据不同的错误内容显示到模板上面。

教程上的老师说的很对,至少在模板上用户名和密码错误,最好不要单独输出用户名错误,密码错误这样,不如很容易让其他人去猜用户名或者密码,直接就笼统的说用户名和密码错误,让其他人慢慢猜,也相对较为安全。

登录成功后,因为设置和保存了session信息了,所以可以直接输出相关信息,比如欢迎登录ADMIN,这样。
TP的模板框架,直接使用

{$_SESSION['username']}

即可输出当前session里面的用户名信息了。

登录后主页里,肯定还有个退出按钮。
再做个logout方法实现退出

//用户退出
public function logout (){
    session(null);    //删除session
    $this -> redirect('Manager/login');    //返回登录界面
}

相关session的使用方法在TP手册里有说,大概也记录下。
tp框架关于session操作(cookie)

session(name,value, 有效时间)  设置session
session(name)  获取session
session(name,null)  删除指定session
session(null)  清空全部session

redirect()和success()方法的区别在于,redirect()没有TP那经典的笑脸出现,而且redirect()可以在跳转的过程中再继续传入参数。

在查询用户名密码使用的getBy()和原来的select(),find()不同在于getBy()是动态查询,针对数据表的字段进行查询。

最后修改:2016 年 01 月 23 日
如果觉得我的文章对你有用,请随意赞赏