2

我正在为我的应用程序使用 yii2 basic。当我通过输入错误的用户名或密码登录我的应用程序时,它不会设置任何消息,例如用户名或密码错误。浏览器只是刷新页面。

这是我的站点/login.php文件:

<?php
use yii\helpers\Html;
use yii\bootstrap\ActiveForm;

/* @var $this yii\web\View */
/* @var $form yii\bootstrap\ActiveForm */
/* @var $model app\models\LoginForm */

$this->title = 'Login';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="site-login">
    <h1><?= Html::encode($this->title) ?></h1>

    <p>Please fill out the following fields to login:</p>

    <?php $form = ActiveForm::begin([
        'id' => 'login-form',
        'options' => ['class' => 'form-horizontal'],
        'fieldConfig' => [
            'template' => "{label}\n<div class=\"col-lg-3\">{input}</div>\n<div class=\"col-lg-8\">{error}</div>",
            'labelOptions' => ['class' => 'col-lg-1 control-label'],
        ],
    ]); ?>

    <?= $form->field($model, 'username') ?>

    <?= $form->field($model, 'password')->passwordInput() ?>

    <?= $form->field($model, 'rememberMe')->checkbox([
        'template' => "<div class=\"col-lg-offset-1 col-lg-3\">{input} {label}</div>\n<div class=\"col-lg-8\">{error}</div>",
    ]) ?>

    <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(); ?>

   <!--  <div class="col-lg-offset-1" style="color:#999;">
       You may login with <strong>admin/admin</strong> or <strong>demo/demo</strong>.<br>
       To modify the username/password, please check out the code <code>app\models\User::$users</code>.
   </div> -->
</div>

这是我的登录操作:

public function actionLogin()
    {
        if (!\Yii::$app->user->isGuest) {
            return $this->goHome();
        }

        $model = new LoginForm();
        if ($model->load(Yii::$app->request->post())) {

            $model->password = md5($model->password);
            $model->login();
            return $this->redirect(['site/index']);
        }
        return $this->render('login', [
            'model' => $model,
        ]);
    }

任何帮助将不胜感激。

4

2 回答 2

3

您可以在规则中添加自定义消息错误。

public function rules()
{
    return [
        ['username', 'required', 'message' => 'Please choose a username.'],
    ];
}

它创建一个 JavaScript 验证,并在message验证错误时显示错误。

请参阅验证输入Customizing Error Messages部分。

编辑:

如果您使用的是基本应用程序,请确保您的LoginForm.php有登录表单调用validate。像这样的东西:

public function login()
{
    if ($this->validate()) {
        return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0);
    } else {
        return false;
    }
}

这是来自高级模板,但类似。

于 2015-09-02T09:01:24.530 回答
2

-statementif ($model->load())根本不进行验证。它只是确定是否已发布相关表单以及是否已将 POST 数据加载到表单实例中。我假设该login()函数返回 abool所以你还必须检查它的返回结果:

public function actionLogin()
{
    if (!\Yii::$app->user->isGuest) {
        return $this->goHome();
    }

    $model = new LoginForm();
    if ($model->load(Yii::$app->request->post())) {

        $model->password = md5($model->password);
        if ($model->login()) {
           return $this->redirect(['site/index']);
        } 
    }
    return $this->render('login', [
        'model' => $model,
    ]);
}

如果登录功能正确使用该model::addError()功能,那么它也应该显示错误。

正如login@Sageth 指出的那样,基本应用程序的 -function 确实运行了验证,因此我提出的更改将按预期工作。

于 2015-09-02T06:31:20.033 回答