这段时间一直在学习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()是动态查询,针对数据表的字段进行查询。