之前提到了注解路由,因此希望这一次使用注解路由的形式来构建登录页面。同时为了更好的理解thinkPHP的插件,决定引入验证码插件,具体的配置方法如下:
验证码:composer require topthink/think-captcha
注解路由:composer require topthink/think-annotation
使用composer下载完成之后,如果在app/config目录下出现了captcha.php和annotation.php文件证明配置成功。
首先,模仿之前创建控制器和用户新增页面的方法,构建一个login控制器,同时在view下新建一个login文件,并在login目录下新建一个index.html文件,将之前写好的用户新增表单复制进去,稍作修改,仅保留用户名和密码输入框,得到结果如下:
接下来,在管理员密码下新增如下代码:
<div class="form-group">
<label for="captcha" class="col-sm-2 control-label captcha-img">{:captcha_img()}</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="captcha" required name="captcha" placeholder="请输入验证码">
</div>
</div>
利用{:captcha_img()}
可以很方便的构建一张验证码图片,得到效果如下:
至于验证码的验证可以使用如下方式:
(1)在验证码输入框中增加name="captcha"
属性,便于POST提交表单之后获取用户输入的验证码;
(2)在login控制器下面新增一个方法check,当用户点击登录提交表单之后,将数据提交给check,在check函数里面利用$request->param()
获取提交参数,得到上面所说的用户输入的captcha
;
(3)接下来,利用验证器组件自带的检测函数captcha_check
检测验证码是否正确,该函数只有一个参数,内容为待验证的验证码;
使用举例如下:
$data=$request->param();
if(captcha_check($data['captcha'])){
echo '验证码正确';
}
对于后台用户身份的验证,验证码的验证可以直接使用上述函数检测,对于用户用户名和用户密码的验证则要相对复杂一些。需要考虑如下几种情况:
(1)用户名相同,密码不同(通常情况下是不会出现的,但也存在部分网站没有限制用户名唯一);
(2)用户名不同,用户密码相同;
针对上述情况,可以采用如下验证方法:
$validate=validate::rule([
'name'=>'unique:auth,name^password'
])->check([
'name' => $data['name'],
'password' => sha1($data['password'])
]);
解释:使用thinkPHP6自带的validate验证控制器,和前面的验证器使用方法差不多,只是没有另设置文件传递提示信息。重点是rule里面的验证规则写法,unique:数据库名称,由于之前设计数据表的时候设置了默认前缀,因此这里就不需要再写前缀名了。
验证规则的unique的使用方法如下:
unique:table,field,except,pk
其中table参数是限制待验证的字段在该数据表中是唯一的,field字段是用来验证其他字段,如果是多个字段同时验证唯一性,使用“^
”来连接,如果是多个字段分开验证在数据表中的唯一性使用“&
”来连接,举例如下:
// 多个字段验证唯一验证条件,验证name,status,account这一组值唯一
'name' => 'unique:user,status^account',
// 多个字段分别验证唯一性
'name' => 'unique:user,status&account',
至于其他参数的用法可以参考thinkPHP官网教程,这里不多做说明。这里使用的验证方法属于反向验证,其含义是:借助validate的验证条件来判断,validate的unique表示的是用户名和密码构成的联合体需要在数据库中是唯一的。现在如果用户输入的用户名密码刚好匹配了,反而会由于unique验证而报错。对于其他的用户名、密码只要能通过唯一校验则说明用户名密码至少有一个错误。
只要用户输入的用户名和密码都通过验证,我们可以跳转到 localhost/index.php/user。
我们知道,对于后台页面,我们可以直接使用 localhost/index.php/user访问。这里就涉及路由中间件的使用了,下面简单来介绍一下路由中间件的使用方式:
Route::resource('user','User')->middleware(function($request,Closure $next){
if(!session('?admin')){
return redirect('/index.php/login');
}
return $next($request);
});
解释:middleware里面函数的参数是必填项,可以看成一种固定的语法。这里表示的是,如果用户的adminsession没有的haul将会跳转到用户登录页面。
一般情况下,session的过期时间是30分钟左右,因此我们可以在用户第一次登录的时候,创建一个session键值对,之后用户访问其他页面,只需要检测是否含有这个session键值对,如果有的话就说明用户依然是登录状态,否则用户需要重新登录。相关的session函数有以下几个:
//检测是否含有键名为admin的session信息
session('?admin')
//设置session信息
session('admin',"凌空暗羽");
//删除session信息
session('admin',null);
如果用户需要退出登录,直接删除session信息就行,这样通过session就能灵活监测并操作用户的登录登出信息了。
plus:这篇博文简洁了些,理论学的差不多了,赶紧溜去实战啦~