Доброго времени суток. Делаю регистрацию с подтверждением ,сделал почти всё, проверка,- есть ли уже такой емаил или пользователь, база записывает приходит письмо на почту с сылкой,. Вот только авторизация возможна и без перехода по ссылки подтверждения, как можно это исправить где искать ошибку ? (Yii2-basic) model Код (Text): public function register() { if (!$this->validate()) { return false; } /** @var User $user */ $user = Yii::createObject(User::className()); $user->setScenario('register'); $this->loadAttributes($user); token.php Код (Text): class Token extends ActiveRecord { use ModuleTrait; const TYPE_CONFIRMATION = 0; const TYPE_RECOVERY = 1; const TYPE_CONFIRM_NEW_EMAIL = 2; const TYPE_CONFIRM_OLD_EMAIL = 3; /** * @return \yii\db\ActiveQuery */ public function getUser() { return $this->hasOne($this->module->modelMap['User'], ['id' => 'user_id']); } /** * @return string */ public function getUrl() { switch ($this->type) { case self::TYPE_CONFIRMATION: $route = '/user/registration/confirm'; break; case self::TYPE_RECOVERY: $route = '/user/recovery/reset'; break; case self::TYPE_CONFIRM_NEW_EMAIL: case self::TYPE_CONFIRM_OLD_EMAIL: $route = '/user/settings/confirm'; break; default: throw new \RuntimeException(); } return Url::to([$route, 'id' => $this->user_id, 'code' => $this->code], true); } /** * @return bool Whether token has expired. */ public function getIsExpired() { switch ($this->type) { case self::TYPE_CONFIRMATION: case self::TYPE_CONFIRM_NEW_EMAIL: case self::TYPE_CONFIRM_OLD_EMAIL: $expirationTime = $this->module->confirmWithin; break; case self::TYPE_RECOVERY: $expirationTime = $this->module->recoverWithin; break; default: throw new \RuntimeException(); } return ($this->created_at + $expirationTime) < time(); } /** @inheritdoc */ public function beforeSave($insert) { if ($insert) { static::deleteAll(['user_id' => $this->user_id, 'type' => $this->type]); $this->setAttribute('created_at', time()); $this->setAttribute('code', Yii::$app->security->generateRandomString()); } return parent::beforeSave($insert); } /** @inheritdoc */ public static function tableName() { return '{{%token}}'; } /** @inheritdoc */ public static function primaryKey() { return ['user_id', 'code', 'type']; } } controller Код (Text): public function actionRegister() { if (!$this->module->enableRegistration) { throw new NotFoundHttpException(); } /** @var RegistrationForm $model */ $model = \Yii::createObject(RegistrationForm::className()); $event = $this->getFormEvent($model); $this->trigger(self::EVENT_BEFORE_REGISTER, $event); $this->performAjaxValidation($model); if ($model->load(\Yii::$app->request->post()) && $model->register()) { $this->trigger(self::EVENT_AFTER_REGISTER, $event); return $this->render('/message', [ 'title' => \Yii::t('user', 'Your account has been created'), 'module' => $this->module, ]); } }
@roswww Создай поле email_verified_at default null и после перехода по ссылке ставь туда дата. Ну и соответсвенно при логине проверяй. Если в yii нет своего механизма. --- Добавлено --- https://klisl.com/yii2-confirmation_of_registration.html
@roswww, вопрос про вход, а код привели регистрации. Если при входе не должны пропускаться неподтверждённые пользователи, то в модели, отвечающей за вход (обычно в Yii2 делают модель типа LoginForm) и должен быть код, отвечающий за проверку
Добавил поле- email_verified_at default null в user и token ,не чего не записало вход как был таки есть можно и без подтверждения
Да дествительно есть такое нашёл ,в функции из ioginform.php как я понимаю она проверяет, совпадает ли хэш данного пароля с хэшем, сохраненным в базе данных. public function validatePassword($attribute, $params) { if ($this->user === null || !Password::validate($this->password, $this->user->password_hash)) $this->addError($attribute, Yii::t('user', 'Invalid login or password')); } а эта Проверяет форму и регистрирует пользователя. public function login() { if ($this->validate() && $this->user) { $isLogged = Yii::$app->getUser()->login($this->user, $this->rememberMe ? $this->module->rememberFor : 0); if ($isLogged) { $this->user->updateAttributes(['last_login_at' => time()]); } return $isLogged; } return false; } только что тут не так пока не ясно..
@roswww при регистрации ты генерируешь уникальный код ложишь его в бд и отправляешь на емейл. При переходе по ссылке ты сверяешь этот уникальный код с данными в ссылке ?token=HhLJHJHl И если код совпадает или удаляешь код или проставляешь другую метку. А при входе уже проверяешь что там у тебя в бд подтверждено или нет. Как сам придумаешь так и будет работать.
Это хорошая инструкция ,но она для Yii2 Advanced ,а у меня basic ..мне придётся namespace перебивать пути править.
На данный момент так ,после регистрации база записывает NULL ,а после подтверждения присваивает числовое значения.но почему вход открыт ещё до подтверждения на верно нужно условие дописать..
@roswww Ну значит что то не так сделал перепроверяй https://github.com/dektrium/yii2-user/blob/master/docs/configuration.md enableUnconfirmedLogin (Type: boolean, Default value: false) у тебя точно false?
нашёл ошибку enableUnconfirmedLogin (Тип: boolean, Значение по умолчанию: false) Если этот параметр подходит true, пользователи смогут войти в систему, даже если они не подтвердили свою учетную запись. сделал так : 'user' => [ 'class' => 'dektrium\user\Module', 'adminPermission' => 'role, permission', 'admins'=>['admin'], 'enableUnconfirmedLogin' => false,//boolean 'confirmWithin' => 21600,//integer 'cost' => 12, //integer ], Теперь всё работает корректно.спасибо.