Yii登录时不接受正确的密码


Correct password is not accepted in Yii login

嗨,我对yii框架很陌生,目前正在尝试通过数据库身份验证建立登录。但当我试图登录时,我收到了一个错误,说

请修复以下输入错误:密码不正确。

但当我检查数据库表时,我输入了正确的密码。

如果这个有人能帮我吗

这是控制器

<?php
class SiteController extends Controller
{
public function actions()
{
    return array(
        'captcha'=>array(
            'class'=>'CCaptchaAction',
            'backColor'=>0xFFFFFF,
        ),
        'page'=>array(
            'class'=>'CViewAction',
        ),
    );
}
public function actionIndex()
{
    $this->render('index');
}

public function actionError()
{
    if($error=Yii::app()->errorHandler->error)
    {
        if(Yii::app()->request->isAjaxRequest)
            echo $error['message'];
        else
            $this->render('error', $error);
    }
}

public function actionContact()
{
    $model=new ContactForm;
    if(isset($_POST['ContactForm']))
    {
        $model->attributes=$_POST['ContactForm'];
        if($model->validate())
        {
            $name='=?UTF-8?B?'.base64_encode($model->name).'?=';
            $subject='=?UTF-8?B?'.base64_encode($model->subject).'?=';
            $headers="From: $name <{$model->email}>'r'n".
                "Reply-To: {$model->email}'r'n".
                "MIME-Version: 1.0'r'n".
                "Content-Type: text/plain; charset=UTF-8";
            mail(Yii::app()->params['adminEmail'],$subject,$model->body,$headers);
            Yii::app()->user->setFlash('contact','Thank you for contacting us. We will respond to you as soon as possible.');
            $this->refresh();
        }
    }
    $this->render('contact',array('model'=>$model));
}

public function actionLogin()
{
        $form=new LoginForm;
        if(isset($_POST['LoginForm']))
        {
            $form->attributes=$_POST['LoginForm'];
            if($form->validate()  && $form->login()) $this->redirect(Yii::app()->user->returnUrl);
        }
            $this->render('login',array('form'=>$form));
}
public function actionLogout()
{
    Yii::app()->user->logout();
    $this->redirect(Yii::app()->homeUrl);
}

}

这是型号

<?php
class LoginForm extends CFormModel
{
    public $email;
    public $password;

    private $_identity;
public function rules()
    {
        return array(
        array('email, password', 'required'),
        array('email', 'email'),
        array('password', 'authenticate'),
);
    }
public function attributeLabels()
{
            return array('email'=>'Email Address');
}
public function authenticate($attribute,$params)
{
            if(!$this->hasErrors())  // we only want to authenticate when no input errors
                {
                $identity=new UserIdentity($this->email,$this->password);
                $identity->authenticate();
                switch($identity->errorCode)
                {
                    case UserIdentity::ERROR_NONE:
                Yii::app()->user->login($identity);
                break;
                    case UserIdentity::ERROR_USERNAME_INVALID:
                $this->addError('email','Email address is incorrect.');
                break;
        default: // UserIdentity::ERROR_PASSWORD_INVALID
                $this->addError('password','Password is incorrect.');
                break;
                }
            }
    }
public function login()
{
    if($this->_identity===null)
    {
        $this->_identity=new UserIdentity($this->username,$this->password);
        $this->_identity->authenticate();
    }
    if($this->_identity->errorCode===UserIdentity::ERROR_NONE)
    {
        $duration=$this->rememberMe ? 3600*24*30 : 0; // 30 days
        Yii::app()->user->login($this->_identity,$duration);
        return true;
    }
    else
        return false;
}

}

这是视图

<?php
/* @var $this SiteController */
/* @var $model LoginForm */
/* @var $form CActiveForm  */
$this->pageTitle=Yii::app()->name . ' - Login';
$this->breadcrumbs=array(
    'Login',
);
?>
<h1>Login</h1>
<p>Please fill out the following form with your login credentials:</p>
<div class="form">
<?php $myWidget=$this->beginWidget('CActiveForm', array(
    'id'=>'login-form',
    'enableClientValidation'=>true,
    'clientOptions'=>array(
        'validateOnSubmit'=>true,
    ),
)); ?>
    <p class="note">Fields with <span class="required">*</span> are required.</p>
<div>
    <?php echo CHtml::beginForm(); ?>
    <?php echo CHtml::errorSummary($form); ?>
    <div>
    <?php echo CHtml::activeLabel($form,'email'); ?>
    <?php echo CHtml::activeTextField($form,'email') ?>
    </div>
    <div>
    <?php echo CHtml::activeLabel($form,'password'); ?>
    <?php echo CHtml::activePasswordField($form,'password') ?>
    </div>
    <div>
    <?php echo CHtml::submitButton('Login'); ?>
    </div>
    <?php echo CHtml::endForm(); ?>

endWidget();?>

您必须在UserIdentity类中而不是在LoginForm模型中编写身份验证逻辑。

  1. LoginForm型号ex:-

     public function authenticate($attribute, $params) {
        if (!$this->hasErrors()) {
           $this->_identity = new UserIdentity($this->email, $this->password);
           if (!$this->_identity->authenticate())
            $this->addError('password', 'Incorrect username or password.');
      }
    }
    public function login() {
      if ($this->_identity === null) {
          $this->_identity = new UserIdentity($this->email, $this->password);
          $this->_identity->authenticate();
     }
     if ($this->_identity->errorCode === UserIdentity::ERROR_NONE) {
         $duration = $this->rememberMe ? 3600 * 24 * 30 : 0; // 30 days
         Yii::app()->user->login($this->_identity, $duration);
         return true;
     } else
        return false;
    }
    
  2. 对于数据库身份验证,您必须使用components'UserIdentity.php 在身份验证函数中添加身份验证逻辑

    public function authenticate() {
    Yii::app()->getModule('auth')->getModule('user'); #import your module.
    $record = User::model()
            ->findByAttributes(array('email' => CHtml::encode($this->email))); #database call
    if ($record === null)
        $this->errorCode = self::ERROR_USERNAME_INVALID;
    #else if ($record->password !== crypt($this->password, $record->password))
    else if ($record->password !== $this->password)
        $this->errorCode = self::ERROR_PASSWORD_INVALID;
    else {
        $this->_uid = $record->user_id;
        $this->setState('title', $record->user_name);
        $this->setState('uid', $this->_uid);
        $this->errorCode = self::ERROR_NONE;
    }
    return !$this->errorCode;
    

    }

  3. 如果你有基于角色的登录,那么你必须在config/main.hp.中添加WebUser类

    components' => array(
            'user' => array(
                // enable cookie-based authentication
                'class' => 'WebUser',
                'allowAutoLogin' => true,
                'loginUrl'=>array('/site/login'),
                'returnUrl'=>array('/site/index'),
            ),
    }
    
  4. 对于基于角色的评估检查,您必须编写components'WebUser.php类-

     class WebUser extends CWebUser {
    public function checkAccess($operation, $params = array()) {
        if (empty($this->id)) {
            // Not identified => no rights
            return false;
        }
        $role = $this->getState("roles");
        if ($role === '3') {            
            return true; // super admin role has access to everything
        }else if ($role === '1') {            
            return true; // admin(manager) role has access to everything
        }         
        // allow access if the operation request is the current user's role
        return ($operation === $role);
    }
    }
    

有关更多信息,请查看身份验证和授权

常见/models/User.php

    public function rules()
   {
    return [
        ['status', 'default', 'value' => self::STATUS_INACTIVE],
        ['status', 'in', 'range' => [self::STATUS_ACTIVE, 
        self::STATUS_INACTIVE, self::STATUS_DELETED]],
    ];
    }

在此方法中,设置默认的"value"=>self::STATUS_ACTIVE你的问题会解决的。我也有同样的问题。在将值更改为"活动"后,它起到了作用,因为它设置的默认值是9,并且数据库认为它是一个非活动条目,这就是它绑定错误id或密码的原因。我希望这能有所帮助。