За последние 24 часа нас посетили 22322 программиста и 1023 робота. Сейчас ищут 682 программиста ...

Вход без подтверждения.

Тема в разделе "Yii", создана пользователем roswww, 24 ноя 2018.

  1. roswww

    roswww Активный пользователь

    С нами с:
    15 окт 2016
    Сообщения:
    154
    Симпатии:
    4
    Адрес:
    Cтаврополь
    Доброго времени суток.

    Делаю регистрацию с подтверждением ,сделал почти всё, проверка,- есть ли уже такой емаил или пользователь, база записывает приходит письмо на почту с сылкой,.

    Вот только авторизация возможна и без перехода по ссылки подтверждения,
    как можно это исправить где искать ошибку ? (Yii2-basic)

    model
    Код (Text):
    1. public function register()
    2.     {
    3.         if (!$this->validate()) {
    4.             return false;
    5.         }
    6.  
    7.         /** @var User $user */
    8.         $user = Yii::createObject(User::className());
    9.         $user->setScenario('register');
    10.         $this->loadAttributes($user);
    token.php
    Код (Text):
    1. class Token extends ActiveRecord
    2. {
    3.     use ModuleTrait;
    4.  
    5.     const TYPE_CONFIRMATION      = 0;
    6.     const TYPE_RECOVERY          = 1;
    7.     const TYPE_CONFIRM_NEW_EMAIL = 2;
    8.     const TYPE_CONFIRM_OLD_EMAIL = 3;
    9.  
    10.     /**
    11.      * @return \yii\db\ActiveQuery
    12.      */
    13.     public function getUser()
    14.     {
    15.         return $this->hasOne($this->module->modelMap['User'], ['id' => 'user_id']);
    16.     }
    17.  
    18.     /**
    19.      * @return string
    20.      */
    21.     public function getUrl()
    22.     {
    23.         switch ($this->type) {
    24.             case self::TYPE_CONFIRMATION:
    25.                 $route = '/user/registration/confirm';
    26.                 break;
    27.             case self::TYPE_RECOVERY:
    28.                 $route = '/user/recovery/reset';
    29.                 break;
    30.             case self::TYPE_CONFIRM_NEW_EMAIL:
    31.             case self::TYPE_CONFIRM_OLD_EMAIL:
    32.                 $route = '/user/settings/confirm';
    33.                 break;
    34.             default:
    35.                 throw new \RuntimeException();
    36.         }
    37.  
    38.         return Url::to([$route, 'id' => $this->user_id, 'code' => $this->code], true);
    39.     }
    40.  
    41.     /**
    42.      * @return bool Whether token has expired.
    43.      */
    44.     public function getIsExpired()
    45.     {
    46.         switch ($this->type) {
    47.             case self::TYPE_CONFIRMATION:
    48.             case self::TYPE_CONFIRM_NEW_EMAIL:
    49.             case self::TYPE_CONFIRM_OLD_EMAIL:
    50.                 $expirationTime = $this->module->confirmWithin;
    51.                 break;
    52.             case self::TYPE_RECOVERY:
    53.                 $expirationTime = $this->module->recoverWithin;
    54.                 break;
    55.             default:
    56.                 throw new \RuntimeException();
    57.         }
    58.  
    59.         return ($this->created_at + $expirationTime) < time();
    60.     }
    61.  
    62.     /** @inheritdoc */
    63.     public function beforeSave($insert)
    64.     {
    65.         if ($insert) {
    66.             static::deleteAll(['user_id' => $this->user_id, 'type' => $this->type]);
    67.             $this->setAttribute('created_at', time());
    68.             $this->setAttribute('code', Yii::$app->security->generateRandomString());
    69.         }
    70.  
    71.         return parent::beforeSave($insert);
    72.     }
    73.  
    74.     /** @inheritdoc */
    75.     public static function tableName()
    76.     {
    77.         return '{{%token}}';
    78.     }
    79.  
    80.     /** @inheritdoc */
    81.     public static function primaryKey()
    82.     {
    83.         return ['user_id', 'code', 'type'];
    84.     }
    85. }
    controller
    Код (Text):
    1.  
    2.     public function actionRegister()
    3.     {
    4.         if (!$this->module->enableRegistration) {
    5.             throw new NotFoundHttpException();
    6.         }
    7.  
    8.         /** @var RegistrationForm $model */
    9.         $model = \Yii::createObject(RegistrationForm::className());
    10.         $event = $this->getFormEvent($model);
    11.  
    12.         $this->trigger(self::EVENT_BEFORE_REGISTER, $event);
    13.  
    14.         $this->performAjaxValidation($model);
    15.  
    16.         if ($model->load(\Yii::$app->request->post()) && $model->register()) {
    17.             $this->trigger(self::EVENT_AFTER_REGISTER, $event);
    18.  
    19.             return $this->render('/message', [
    20.                 'title'  => \Yii::t('user', 'Your account has been created'),
    21.                 'module' => $this->module,
    22.             ]);
    23.         }
    24. }
     
  2. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    @roswww Создай поле email_verified_at default null и после перехода по ссылке ставь туда дата. Ну и соответсвенно при логине проверяй. Если в yii нет своего механизма.
    --- Добавлено ---
    https://klisl.com/yii2-confirmation_of_registration.html
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    @roswww, вопрос про вход, а код привели регистрации. Если при входе не должны пропускаться неподтверждённые пользователи, то в модели, отвечающей за вход (обычно в Yii2 делают модель типа LoginForm) и должен быть код, отвечающий за проверку
     
  4. roswww

    roswww Активный пользователь

    С нами с:
    15 окт 2016
    Сообщения:
    154
    Симпатии:
    4
    Адрес:
    Cтаврополь
    Добавил поле- email_verified_at default null в user и token ,не чего не записало вход как был таки есть можно и без подтверждения
     
  5. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    @roswww Ну тут совсем все запущенно. Я же абстрактно объяснил. Лучше следуй инструкции по ссылке.
     
  6. roswww

    roswww Активный пользователь

    С нами с:
    15 окт 2016
    Сообщения:
    154
    Симпатии:
    4
    Адрес:
    Cтаврополь
    Да дествительно есть такое нашёл ,в функции из 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;
    }

    только что тут не так пока не ясно..
     
  7. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    @roswww при регистрации ты генерируешь уникальный код ложишь его в бд и отправляешь на емейл. При переходе по ссылке ты сверяешь этот уникальный код с данными в ссылке ?token=HhLJHJHl И если код совпадает или удаляешь код или проставляешь другую метку. А при входе уже проверяешь что там у тебя в бд подтверждено или нет. Как сам придумаешь так и будет работать.
     
  8. roswww

    roswww Активный пользователь

    С нами с:
    15 окт 2016
    Сообщения:
    154
    Симпатии:
    4
    Адрес:
    Cтаврополь
    Это хорошая инструкция ,но она для Yii2 Advanced ,а у меня basic ..мне придётся
    namespace перебивать пути править.
     
  9. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
  10. roswww

    roswww Активный пользователь

    С нами с:
    15 окт 2016
    Сообщения:
    154
    Симпатии:
    4
    Адрес:
    Cтаврополь
    На данный момент так ,после регистрации база записывает NULL ,а после подтверждения присваивает числовое значения.но почему вход открыт ещё до подтверждения на верно нужно условие дописать..
     
  11. roswww

    roswww Активный пользователь

    С нами с:
    15 окт 2016
    Сообщения:
    154
    Симпатии:
    4
    Адрес:
    Cтаврополь
  12. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
  13. roswww

    roswww Активный пользователь

    С нами с:
    15 окт 2016
    Сообщения:
    154
    Симпатии:
    4
    Адрес:
    Cтаврополь
    нашёл ошибку

    enableUnconfirmedLogin (Тип: boolean, Значение по умолчанию: false)
    Если этот параметр подходит true, пользователи смогут войти в систему, даже если они не подтвердили свою учетную запись.

    сделал так :
    'user' => [
    'class' => 'dektrium\user\Module',
    'adminPermission' => 'role, permission',
    'admins'=>['admin'],
    'enableUnconfirmedLogin' => false,//boolean
    'confirmWithin' => 21600,//integer
    'cost' => 12, //integer
    ],

    Теперь всё работает корректно.спасибо.