开启了Auth这个中间件之后,验证码验证不通过,分析是session为空,所以验证码的check方法就return false,导致验证不通过。把Auth关掉后,验证码就正确了。请问下怎么解决?tp 6.0.5版本
2020/11/7更新 搞了一晚,搜了很久,还是没有搞好。
app/admin/controller/CaptchaController 的代码
<?php
namespace app\admin\controller;
use think\captcha\facade\Captcha;
class CaptchaController
{
public function index(){
return Captcha::create();
}
}
app/admin/controller/LoginController的代码
<?php
namespace app\admin\controller;
use app\common\model\mysql\AdminUser;
use think\facade\View;
use think\response\Json;
class LoginController extends AdminBaseController
{
public function index(){
return View::fetch();
}
/**
* 验证账户
* @return Json
*/
public function check() {
if (!$this->request->isPost()){
return show(config("status.error"), "请求方式错误");
}
// 参数检验 1、原生方式 2、TP6机制
$username = $this->request->param("username","","trim");
$password = $this->request->param("password","","trim");
$captcha = $this->request->param("captcha","","trim");
if(empty($username) || empty($password) || empty($captcha)) {
return show(config("status.error"), "参数不能为空");
}
if(!captcha_check($captcha)) {
// 一定要去middleware总开启session
// 验证码校验失败
return show(config("status.error"), "验证码不正确");
}
try {
$adminUserObj = new AdminUser();
$adminUser = $adminUserObj->getAdminUserByUserName($username);
if (empty($adminUser) || $adminUser->status != config("status.mysql.table_normal")) {
return show(config("status.error"), "不存在该用户");
}
$adminUser = $adminUser->toArray();
// 判断密码是否正确
if ($adminUser['password'] != md5($password)) {
return show(config("status.error"), "密码错误");
}
// 记录信息到mysql表中
$upDateData = [
'update_time' => date('Y-m-d H:i:s'),
'last_login_time' => date('Y-m-d H:i:s'),
'last_login_ip' => request()->ip(),
];
$res = $adminUserObj->upDateById($adminUser['id'], $upDateData);
if (empty($res)) {
return show(config("status.error"), "登陆失败");
}
} catch (\Exception $e) {
// todo 记录日志 $e->getMessage()
return show(config("status.error"), "内部异常,登陆失败");
}
// 记录session
session(config('admin.session_admin'), $adminUser);
return show(config("status.success"), "登录成功");
}
}
app\admin\controller\AdminController的代码
<?php
namespace app\admin\controller;
use app\BaseController;
class AdminBaseController extends BaseController
{
public $adminUser = null;
public function initialize() {
parent::initialize();
// 判断是否登录 切换到中间件
}
public function isLogin() {
$this->adminUser = session(config('admin.session_admin'));
if(empty($this->adminUser)){
return false;
}
return true;
}
}
app/admin/midlleware/Auth的代码
<?php
declare (strict_types = 1);
namespace app\admin\middleware;
use think\Response;
class Auth
{
public function handle ($request, \Closure $next){
// 前置中间件
// dump($request);
// 后置中间件
if (empty(session(config('admin.session_admin'))) && !preg_match('/login/', $request->pathinfo())){
return redirect((string)url('login/index'));
}
return $next($request);
}
/**
* 中间件结束调度
* @param Response $response
*/
public function end(Response $response){
}
}
helper 下的的代码
/**
* @param $id
* @return string
*/
function captcha_img($id = '', $width='', $height='',$model=''): string
{
$src = captcha_src($id);
$style = "";
if ($width && $height) {
$style = 'width="' . $width . '" height="' . $height . '"';
}
$src = !empty($model) ? '/' . $model . $src : $src;
return "<img src='{$src}' alt='captcha' " . $style . " onclick='this.src=\"{$src}?\"+Math.random();' />";
}
login.htmld的调用代码
<div class="admin-captcha">{:captcha_img('', 140, 40,'')}</div>
中间注册:Auth 和 Session中间件在应用下的midlleware.php 也有注册。
全局注册:Session中间件在全局中也有注册。
captcha_img最后一个参数我传admin的话,会获取二维码失败,因为重定向了,是需要在Auth代码中加入captcha的验证就可以获取,但这个方法并没有在我这解决提示验证码不正确的问题,因为为了保持和老师的代码一致性,因此没传admin,非常感谢@keryz 大神同学。
求助:验证码验证不通过的问题,该怎么解决?