2017-09-15 97 views
1

我想在Yii2中定制登录失败消息。 现在,当我输入错误username或错误password它将显示两个相同的消息。Yii2:根据确切原因定制登录失败消息

现在我有一列user表即is_verified 如果用户的电子邮件验证,然后我把这个字段的值为1,否则0

如果用户注册和不检验他的电子邮件的is_verified=0的价值

现在,如果用户想要登录则表明Incorrect username or password.

,但我想告诉大家,他的电子邮件未验证用户。

LoginForm.php功能validatePassword将通过这个错误

public function validatePassword($attribute, $params) { 
     if (!$this->hasErrors()) { 
      $user = $this->getUser(); 
      if (!$user || !$user->validatePassword($this->password)) { 
       $this->addError($attribute, 'Incorrect username or password.'); 
      } 
     } 
    } 

请在此帮助或提供任何想法我怎么能覆盖默认登录功能

我使用yii2-basic-app

一件事$user = $this->getUser();这将只返回那些默认情况下我的status=10 用户设置用户status=0直到他无法确认他的电子邮件

什么想做的事:

if(username not exist in db){ 
     echo "username not found in db"; 
    }elseif(password not valid){ 
     echo "password not valid"; 
    }elseif(is_verified=0){ 
     echo "email not verified"; 
    }elseif(status = 0){ 
     echo "account is deactive"; 
    } 

代码app\models\User.php

/** 
    * @inheritdoc 
    */ 
    public static function findIdentity($id) { 
     return static::findOne(['id' => $id, 'status' => self::STATUS_ACTIVE]); 
    } 

    /** 
    * @inheritdoc 
    */ 
    public static function findIdentityByAccessToken($token, $type = null) { 
     throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.'); 
    } 

    /** 
    * Finds user by username 
    * 
    * @param string $username 
    * @return static|null 
    */ 
    public static function findByUsername($username) { 
     return static::findOne(['email' => $username, 'status' => self::STATUS_ACTIVE]); 
    } 

    /** 
    * Finds user by password reset token 
    * 
    * @param string $token password reset token 
    * @return static|null 
    */ 
    public static function findByPasswordResetToken($token) { 
     if (!static::isPasswordResetTokenValid($token)) { 
      return null; 
     } 

     return static::findOne([ 
      'password_reset_token' => $token, 
      'status' => self::STATUS_ACTIVE, 
     ]); 
    } 

    /** 
    * Finds out if password reset token is valid 
    * 
    * @param string $token password reset token 
    * @return boolean 
    */ 
    public static function isPasswordResetTokenValid($token) { 
     if (empty($token)) { 
      return false; 
     } 
     $expire = Yii::$app->params['user.passwordResetTokenExpire']; 
     $parts = explode('_', $token); 
     $timestamp = (int) end($parts); 
     return $timestamp + $expire >= time(); 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function getId() { 
     return $this->getPrimaryKey(); 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function getAuthKey() { 
     return $this->auth_key; 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function validateAuthKey($authKey) { 
     return $this->getAuthKey() === $authKey; 
    } 

    /** 
    * Validates password 
    * 
    * @param string $password password to validate 
    * @return boolean if password provided is valid for current user 
    */ 
    public function validatePassword($password) { 
     return Yii::$app->security->validatePassword($password, $this->password_hash); 
    } 

    /** 
    * Generates password hash from password and sets it to the model 
    * 
    * @param string $password 
    */ 
    public function setPassword($password) { 
     $this->password_hash = Yii::$app->security->generatePasswordHash($password); 
    } 

    /** 
    * Generates "remember me" authentication key 
    */ 
    public function generateAuthKey() { 
     $this->auth_key = Yii::$app->security->generateRandomString(); 
    } 

    /** 
    * Generates new password reset token 
    */ 
    public function generatePasswordResetToken() { 
     $this->password_reset_token = Yii::$app->security->generateRandomString() . '_' . time(); 
    } 

    /** 
    * Removes password reset token 
    */ 
    public function removePasswordResetToken() { 
     $this->password_reset_token = null; 
    } 

代码从app\models\LoginForm.php

/** 
    * Validates the password. 
    * This method serves as the inline validation for password. 
    * 
    * @param string $attribute the attribute currently being validated 
    * @param array $params the additional name-value pairs given in the rule 
    */ 
    public function validatePassword($attribute, $params) { 
     if (!$this->hasErrors()) { 
      $user = $this->getUser(); 
      if (!$user || !$user->validatePassword($this->password)) { 
       $this->addError($attribute, 'Incorrect username or password.'); 
      } 
     } 
    } 

    /** 
    * Logs in a user using the provided username and password. 
    * 
    * @return boolean whether the user is logged in successfully 
    */ 
    public function login() { 
     if ($this->validate()) { 
      return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0); 
     } else { 
      return false; 
     } 
    } 

    /** 
    * Finds user by [[username]] 
    * 
    * @return User|null 
    */ 
    public function getUser() { 
     if ($this->_user === false) { 
      $this->_user = User::findByusername($this->username); 
     } 

     return $this->_user; 
    } 

谢谢。

+0

你使用yii2用户扩展吗? – Kalu

+0

不,我没有使用任何扩展 –

回答

1

,你可以检查车况!$user!$user->validatePassword($this->password) separatly

public function validatePassword($attribute, $params) { 
     if (!$this->hasErrors()) { 
      $user = $this->getUser(); 
      if (!$user |) { 
       $this->addError($attribute, 'Invalid username.'); 
       return; 
      } 
      if (!$user->validatePassword($this->password)) { 
       $this->addError($attribute, 'Incorrect password.'); 
       return; 
      } 
     } 
    } 

,你可以检查用户是否正确设置好的这样

假设你有一个用户模型类

$checkUser = User::find()->where('username' => $your_userName)->one(); 
    if isset($checkUser){ 
     if($checkUser->status = 0){ 
     // User not activated 
    } 
    } else { 
    // user not present 
} 

寻找你的代码,你可以检查输入的用户名是否已经启用,例如:

public function login() { 
    if ($this->validate()) { 
     if ( User::find()->where(['username' => $this->username , 'status' => 0 ) { 
      // mean the user is not validated .. 
      $this->addError($attribute, 'User not validated .. '); 
      return false 
     } else { 
      return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0); 

     } 
    } else { 
     return false; 
    } 
} 
+0

然后用户名无效 – scaisEdge

+0

'$ user = $ this-> getUser();'这将只返回那些'status = 10'的用户默认情况下我设置用户'状态= 0'直到他没有验证他的电子邮件,所以直到他的状态= 10,我总是会在'$ this-> getUser()中出错;' –

+0

用户名有效,但状态为无效 –

0

覆盖beforeValidate()函数并添加您的支票。 即:

public function beforeValidate() 
{ 
    if (parent::beforeValidate()) { 
     $this->user = findUserByUsernameOrEmail(trim($this->username)); 
     if ($this->user !== null && $this->user->is_verified === 0) { 
      $this->addError('username' , ' Email not verified....etc'); 
     } 
    } 

} 
1

据我理解你,功能:

public function validatePassword($attribute, $params) { 
    if (!$this->hasErrors()) { 
     $user = $this->getUser(); 
     if (!$user || !$user->validatePassword($this->password)) { 
      $this->addError($attribute, 'Incorrect username or password.'); 
      return false; 
     } 
     if(!$user->is_verified){ 
      $this->addError('username', 'Email is not verified.'); 
      return false; 
     }  
    } 
} 

当然,如果你从数据库获取你的用户,在其他情况下,你必须写在用户或LoginForm的模型多了一个方法获得电子邮件状态表格数据库,使用ActiveRecords,例如:

public function validatePassword($attribute, $params) { 
    if (!$this->hasErrors()) { 
     $user = $this->getUser(); 
     if (!$user || !$user->validatePassword($this->password)) { 
      $this->addError($attribute, 'Incorrect username or password.'); 
      return false; 
     } 
     if(!$user->getUserEmailStatus()){ 
      $this->addError('username', 'Email is not verified.'); 
      return false; 
     }  
    } 
} 
+0

'$ user = $ this-> getUser();'这将只返回那些'status = 10'的用户,默认情况下我设置用户'status = 0'直到他没有验证他的电子邮件地址 –

+0

在这种情况下你需要如果($ user-> status!= 10)$ this->覆盖,这个函数将返回给用户状态,然后检查他的状态,在'validatePassword()' '... addError('用户名','电子邮件未验证。'); 返回false; } ...' – vityapro

0

我已经找到了解决方案,现在它的工作如我所料。 所有积分均为@scaisEdge。 我从他的建议中得到了启发。现在我发布的实际代码是:

public function validatePassword($attribute, $params) { 

    if (!$this->hasErrors()) { 
     $user = $this->getUser(); 
     if (!$user) { 
      $this->addError("username", 'Invalid username.'); 
      return; 
     } 
     if (!$user->validatePassword($this->password)) { 
      $this->addError($attribute, 'Incorrect password.'); 
      return; 
     } 
     if (User::find()->where(['email' => $this->username])->andwhere(['verified' => 0])->one()) { 

      $this->addError("username", 'email not varified '); 
      return; 
     } 
     if (User::find()->where(['username' => $this->username])->andwhere(['status' => 0])->one()) { 

      $this->addError($attribute, 'account is not active'); 
      return; 
     } 
    } 
} 

谢谢所有回答我的人和善待我的人。

我发布了此答案,以便其他人可以从中获得帮助。

相关问题