2015-09-07 03:03:02 8745次浏览 2条回答 2 悬赏 20 金钱

最近学习下yii2框架,在验证码这块遇见了验证失败的问题,验证图片能出来,可是无论怎么输都是错误的,下面上代码:

结构
  models
   User.php
  modules
   admin
    controllers
     DefaultController
    views
     default
      index.php

控制器代码

<?php

namespace app\modules\admin\controllers;
use app\models\User;
use Yii;
use yii\web\Controller;
use yii\helpers\Url;

class DefaultController extends Controller
{
    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction'
            ],
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',
                'backColor'=>0x000000,//背景颜色
                'width' => 120,
                'height' => 40,
                'padding' => 0,
                'minLength' => 4,
                'maxLength' => 4,
                'foreColor'=>0xffffff,     //字体颜色
                'offset'=>8,        //设置字符偏移量 有效果
                'testLimit'=>999,
            ],
        ];
    }
    public function actionIndex()
    {
        Yii::$app->controller->layout='main';
        if (!\Yii::$app->user->isGuest) {
            $this->redirect(Url::toRoute('platform/index')); //已登录直接跳转
        }
        $model = new User(['scenario' => 'login']);//实例化的是登陆场景
        if($model->load(Yii::$app->request->post())&&$model->login()){
            $this->redirect(Url::toRoute('platform/index')); //已登录直接跳转
        }else{
            return $this->render('index',[
                'model'=>$model,
            ]);
        }
    }
}

模型代码

class User extends \app\core\base\BaseActiveRecord implements IdentityInterface
{
    //登录时使用,记住我,验证码,加密后密码
    public $rememberMe = false;
    public $verifyCode;
    public $password_hash;

    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return '{{%user}}';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            //登录场景
            [['username','password','verifyCode'], 'required'],
            [['username', 'password'], 'string', 'max' => 255],
            ['username', 'string', 'length' => [2, 18], 'on' => 'login'], //长度验证
            ['password', 'string', 'length' => [6, 22], 'on' => 'login'],
            ['password', 'validatePassword', 'on' => 'login'], //调用validatePassword
            ['verifyCode', 'captcha', 'on' => 'login'], //验证码
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'username' => '用户名',
            'password' => '密码',
            'verifyCode'=>'验证码',
        ];
    }

    public function scenarios() {
        $scenarios = parent::scenarios();
        $scenarios['login'] = ['username', 'password', 'rememberMe','verifyCode'];
        return $scenarios;
    }

视图代码

<?php
use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
use yii\captcha\Captcha;
use app\assets\AppAsset;
$this->title='登陆';
AppAsset::register($this);
?>
<h1><?= Html::encode($this->title) ?></h1>
<?php $form=ActiveForm::begin([
    'fieldConfig' => [
        'template' => "{label}{input}{error}",
    ],
])?>
<div class="clearfix"></div>

<?= $form->field($model, 'verifyCode')->widget(Captcha::className(), [
    'template' => '<div class="input-group input-group-lg col-md-8"><span class="input-group-addon"><i class="glyphicon glyphicon-eye-open red"></i></span>{input}<div class="input-group-addon" style="padding:5px;">{image}</div></div>',
    'options' => ['class' => 'form-control','placeholder'=>"验证码"],
    'captchaAction' => 'default/captcha',
])->label(false) ?>
<div class="clearfix"></div>
<?= $form->field($model, 'rememberMe', [
    'template' => "<label class=\"remember\">{input}记住我</label>",
    'options'=>['class'=>"input-prepend"],
    'labelOptions'=>['class'=>"remember"],
])->checkbox()->label('记住我')?>
<div class="form-group">
    <div class="col-lg-offset-1 col-lg-11">
        <?= Html::submitButton('Login', ['class' => 'btn btn-primary', 'name' => 'login-button']) ?>
    </div>
</div>
<?php ActiveForm::end();?>

图片可以出来可是验证一直不对,希望有大神不吝赐教。

最佳答案

  • 花椒 发布于 2015-09-07 09:24 举报

    貌似User中的规则rules里的验证码部分要指定下action位置,因为我看你是在modules用的,如:

    ['verifyCode', 'captcha', 'captchaAction'=>'admin/default/captcha', 'on' => 'login'], //验证码
    
    8 条回复
    回复于 2015-09-07 12:15 回复

    就是这么回事,朋友帮大忙了,谢谢!

    回复于 2015-09-07 12:22 回复

    請問官網哪裡有這部分阿!! (rules 可以指定 action的位置)!!

    回复于 2015-09-07 13:46 回复

    有时候是可以看框架源码的,嘿嘿
    用的ide是phpstorm,按CTRL跟踪很方便~

    回复于 2015-09-07 14:08 回复

    sublime也有類似的 但~~ 都無法正確地指向 Orz

    回复于 2015-11-12 23:29 回复

    captchaAction 我也设置了,为什么还是提示失败呢?

    回复于 2015-12-29 16:42 回复

    请问为什么我的配置好之后点击切换了图片之后,session里的验证码没有切换,导致点击切换图片之后一直验证错误。。。

    回复于 2017-06-15 11:06 回复

    客户端不验证是怎么回事。输入错误的验证码也不提示

    回复于 2021-12-03 11:22 回复

    $model->save(false) 最好在使用这个 方法的时候加上false,否则二次验证会造成验证码失败!

    , , , , 觉得很赞
  • 回答于 2016-05-28 13:51 举报

    赞一个,的确是 'captchaAction'=>'admin/default/captcha' 的问题

您需要登录后才可以回答。登录 | 立即注册
bravohao
见习主管

bravohao

注册时间:2015-08-04
最后登录:2015-10-07
在线时长:5小时18分
  • 粉丝3
  • 金钱260
  • 威望0
  • 积分310

热门问题