Если вы делаете все это в модели - лучшим решением было бы завести отдельную форму, где были бы прописаны rules() для валидации и фильтрации. В этой же форме, можно реализовать вашу логику авторизации.
class Login extends Model
{
public $identity;
public $password;
public function rules()
{
return [
['identity', 'filter', 'filter' => 'trim'],
['identity', 'required'],
['password', 'required'],
];
}
/**
* @return bool|null|static|User
*/
public function authenticate()
{
if (!$user = User::findIdentityByUsernameOrEmail($this->identity)) {
$this->addError('identity', Yii::t('app', 'invalid_credentials_on_login'));
return false;
}
if (!$user->validatePassword($this->password)) {
$this->addError('identity', Yii::t('app', 'invalid_credentials_on_login'));
return false;
}
return $user;
}
}
/**
* Finds user by username or email
*
* @param string $identity
* @return static|null
*/
public static function findIdentityByUsernameOrEmail($identity)
{
/**
* Try to find identity by nickname
* @var User $user
*/
if ($user = static::findOne(['username' => $identity, 'status' => self::STATUS_ACTIVE])) {
return $user;
}
/**
* Try to find identity by email
* @var LoginAccount $loginAccount
*/
if ($loginAccount = LoginAccount::findByEmail($identity)) {
return $loginAccount->getUser()->one();
}
return null;
}
В моем случае авторизация по email или nickname в одном поле, которое имеет общее название identity, а при поиске пользователя я использую 2 модели, так как email в другой таблице.