请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

验证码问题

开启了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 大神同学。

求助:验证码验证不通过的问题,该怎么解决?

正在回答 回答被采纳积分+3

2回答

keryz 2020-11-06 09:50:52

http://coding.imooc.com/learn/questiondetail/159370.html 


同学,你好看下,这个是否能解决你的问题

1 回复 有任何疑惑可以回复我~
  • 提问者 卡卡卡同学 #1
    感谢,还是不行。
    回复 有任何疑惑可以回复我~ 2020-11-06 23:02:21
  • 提问者 卡卡卡同学 #2
    大神同学,现在session存在,但$this->session->has('captcha')是获取不到,但我在看到session的数据中是有captcha这个key及value。。。。
    回复 有任何疑惑可以回复我~ 2020-11-06 23:18:25
  • 提问者 卡卡卡同学 #3
    大神同学在群里嘛,有空的话,可以帮我看看嘛,万分感谢
    回复 有任何疑惑可以回复我~ 2020-11-06 23:27:20
提问者 卡卡卡同学 2020-11-06 23:18:06

现在session存在,但$this->session->has('captcha')是获取不到,但我在看到session的数据中是有captcha这个key及value。。。。

0 回复 有任何疑惑可以回复我~
  • keryz #1
    同学,你好,你这样描述我也没办法定位,你把相关的代码贴出来看下。或者描述更清楚点。
    回复 有任何疑惑可以回复我~ 2020-11-06 23:36:39
  • 你好解决了吗?我的也是碰到了同样的问题
    回复 有任何疑惑可以回复我~ 2022-05-21 20:14:37
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信