За последние 24 часа нас посетили 9180 программистов и 423 робота. Сейчас ищут 114 программистов ...

Yii::$app->user->isGuest всегда true после логина в Yii2

Тема в разделе "Yii", создана пользователем compplace, 13 сен 2017.

Метки:
  1. compplace

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

    С нами с:
    15 ноя 2012
    Сообщения:
    6
    Симпатии:
    0
    Только начал разбираться с Yii и делаю регистрацию с авторизацией через MySQL.
    Регистрация как-то работает, а вот с авторизацией проблемы.
    В LoginForm::login() авторизация вроде как проходит нормально и в Yii::$app->user есть инфа о текущем юзере, но Yii::$app->user->isGuest всегда true во view всегда true и в сессии тоже пусто.
    LoginForm.php

    Код (PHP):
    1. <?php
    2.  
    3. namespace app\models;
    4.  
    5. use Yii;
    6. use yii\base\Model;
    7.  
    8. /**
    9.  * LoginForm is the model behind the login form.
    10.  *
    11.  * @property User|null $user This property is read-only.
    12.  *
    13.  */
    14. class LoginForm extends Model
    15. {
    16.   public $login;
    17.   public $pass;
    18.   public $rememberMe = true;
    19.  
    20.   private $_user = false;
    21.  
    22.  
    23.   /**
    24.   * @return array the validation rules.
    25.   */
    26.   public function rules()
    27.   {
    28.   return [
    29.   // login and password are both required
    30.   [['login', 'pass'], 'required'],
    31.   // rememberMe must be a boolean value
    32.   ['rememberMe', 'boolean'],
    33.   // password is validated by validatePassword()
    34.   ['pass', 'validatePassword'],
    35.   ];
    36.   }
    37.  
    38.   /**
    39.   * Validates the password.
    40.   * This method serves as the inline validation for password.
    41.   *
    42.   * @param string $attribute the attribute currently being validated
    43.   * @param array $params the additional name-value pairs given in the rule
    44.   */
    45.   public function validatePassword($attribute, $params)
    46.   {
    47.   if (!$this->hasErrors()) {
    48.   $user = $this->getUser();
    49.  
    50.   if (!$user || !$user->validatePassword($this->pass)) {
    51.   $this->addError($attribute, 'Неправильный логин или пароль.');
    52.   }
    53.   }
    54.   }
    55.  
    56.   /**
    57.   * Logs in a user using the provided login and password.
    58.   * @return bool whether the user is logged in successfully
    59.   */
    60.   public function login()
    61.   {
    62.   if ($this->validate())
    63.      {
    64.   $user = $this->getUser();
    65.        if (!$user->active)
    66.        {
    67.   $this->addError('login', 'Ваша учётная запись не активирована.');
    68.          return false;
    69.        }
    70.   return Yii::$app->user->login($user, $this->rememberMe ? 3600*24*30 : 0);
    71.   }
    72.   return false;
    73.   }
    74.  
    75.    public function attributeLabels()
    76.   {
    77.   return [
    78.        'login' => 'Логин',
    79.        'pass' => 'Пароль',
    80.        'rememberMe' => 'Запомнить меня'
    81.   ];
    82.   }
    83.   /**
    84.   * Finds user by [[login]]
    85.   *
    86.   * @return User|null
    87.   */
    88.   public function getUser()
    89.   {
    90.   if ($this->_user === false)
    91.      {
    92.   $this->_user = User::findByLogin($this->login);
    93.   }
    94.  
    95.   return $this->_user;
    96.   }
    97. }
    User.php

    Код (PHP):
    1. <?php
    2.  
    3.  
    4. namespace app\models;
    5. use Yii;
    6. use yii\base\NotSupportedException;
    7. use yii\behaviors\TimestampBehavior;
    8. use yii\db\ActiveRecord;
    9. use yii\web\IdentityInterface;
    10. /**
    11.  * User model
    12.  *
    13.  * @property integer $id
    14.  * @property string $login
    15.  * @property string $pass
    16.  * @property string $password_reset_token
    17.  * @property string $email
    18.  * @property string $auth_key
    19.  * @property integer $status
    20.  * @property integer $created_at
    21.  * @property string $password write-only password
    22.  */
    23. class User extends ActiveRecord implements IdentityInterface
    24. {
    25.   const STATUS_DELETED = 0;
    26.   const STATUS_ACTIVE = 10;
    27.   /**
    28.   * @inheritdoc
    29.   */
    30.   public static function tableName()
    31.   {
    32.   return '{{%user}}';
    33.   }
    34.   /**
    35.   * @inheritdoc
    36.   */
    37.   /*public function behaviors()
    38.   {
    39.   return [
    40.   TimestampBehavior::className(),
    41.   ];
    42.   }*/
    43.   /**
    44.   * @inheritdoc
    45.   */
    46.   public function rules()
    47.   {
    48.   return [
    49.   ['status', 'default', 'value' => self::STATUS_ACTIVE],
    50.   ['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED]],
    51.   ];
    52.   }
    53.   /**
    54.   * @inheritdoc
    55.   */
    56.   public static function findIdentity($id)
    57.   {
    58.   return static::findOne(['id' => $id, 'status' => self::STATUS_ACTIVE]);
    59.   }
    60.   /**
    61.   * @inheritdoc
    62.   */
    63.   public static function findIdentityByAccessToken($token, $type = null)
    64.   {
    65.   throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.');
    66.   }
    67.   /**
    68.   * Finds user by login
    69.   *
    70.   * @param string $login
    71.   * @return static|null
    72.   */
    73.   public static function findBylogin($login)
    74.   {
    75.   return static::findOne(['login' => $login]);
    76.   }
    77.   /**
    78.   * @inheritdoc
    79.   */
    80.   public function getId()
    81.   {
    82.   return $this->getPrimaryKey();
    83.   }
    84.   /**
    85.   * @inheritdoc
    86.   */
    87.   public function getAuthKey()
    88.   {
    89.   return $this->auth_key;
    90.   }
    91.   /**
    92.   * @inheritdoc
    93.   */
    94.   public function validateAuthKey($authKey)
    95.   {
    96.   return $this->getAuthKey() === $authKey;
    97.   }
    98.   /**
    99.   * Validates password
    100.   *
    101.   * @param string $password password to validate
    102.   * @return bool if password provided is valid for current user
    103.   */
    104.   public function validatePassword($password)
    105.   {
    106.   return Yii::$app->security->validatePassword($password, $this->pass);
    107.   }
    108.   /**
    109.   * Generates password hash from password and sets it to the model
    110.   *
    111.   * @param string $password
    112.   */
    113.   public function setPassword($password)
    114.   {
    115.   $this->pass = Yii::$app->security->generatePasswordHash($password);
    116.   }
    117.   /**
    118.   * Generates "remember me" authentication key
    119.   */
    120.   public function generateAuthKey()
    121.   {
    122.   $this->auth_key = Yii::$app->security->generateRandomString();
    123.   }
    124.    
    125.    
    126.    
    127.    //ВОССТАНОВЛЕНИЕ ПАРОЛЯ
    128.    
    129.    public static function findByPasswordResetToken($token)
    130.    {
    131.    
    132.      if (!static::isPasswordResetTokenValid($token)) {
    133.        return null;
    134.      }
    135.    
    136.      return static::findOne([
    137.        'password_reset_token' => $token,
    138.        'status' => self::STATUS_ACTIVE,
    139.      ]);
    140.    }
    141.    
    142.    public static function isPasswordResetTokenValid($token)
    143.    {
    144.      if (empty($token)) {
    145.        return false;
    146.      }
    147.    
    148.      $timestamp = (int) substr($token, strrpos($token, '_') + 1);
    149.      $expire = Yii::$app->params['user.passwordResetTokenExpire'];
    150.      return $timestamp + $expire >= time();
    151.    }
    152.    
    153.    public function generatePasswordResetToken()
    154.    {
    155.      $this->password_reset_token = Yii::$app->security->generateRandomString() . '_' . time();
    156.    }
    157.    
    158.    public function removePasswordResetToken()
    159.    {
    160.      $this->password_reset_token = null;
    161.    }
    162. }
    В web.php такие настройки прописаны:

    Код (PHP):
    1.   'user' => [
    2.   'identityClass' => 'app\models\User',
    3.   'enableAutoLogin' => true,
    4.   ],
    В сессии тоже пусто. Серверные сессии вроде как рабочие.
    В чём может быть проблема?
     
  2. denis01

    denis01 Старожил
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    11.361
    Симпатии:
    1.533
    Адрес:
    Молдова, г.Кишинёв
    Что возвращает?
    PHP:
    1. Yii::$app->user->login
     
  3. compplace

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

    С нами с:
    15 ноя 2012
    Сообщения:
    6
    Симпатии:
    0
    Yii::$app->user->login
    возвращает ошибку
    Getting unknown property: yii\web\User::login
     
  4. denis01

    denis01 Старожил
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    11.361
    Симпатии:
    1.533
    Адрес:
    Молдова, г.Кишинёв
    http://www.yiiframework.com/doc-2.0/yii-web-user.html#login()-detail

    У тебя есть код

    PHP:
    1.   public function login()
    2.   {
    3.   if ($this->validate())
    4.      {
    5.   $user = $this->getUser();
    6.        if (!$user->active)
    7.        {
    8.   $this->addError('login', 'Ваша учётная запись не активирована.');
    9.          return false;
    10.        }
    11.   return Yii::$app->user->login($user, $this->rememberMe ? 3600*24*30 : 0);
    12.   }
    13.   return false;
    14.   }
    надо посмотреть в
    PHP:
    1. return Yii::$app->user->login($user, $this->rememberMe ? 3600*24*30 : 0);
     
  5. compplace

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

    С нами с:
    15 ноя 2012
    Сообщения:
    6
    Симпатии:
    0
    Так он вроде как стандартный исполняется. Я его не менял. В классе User у меня нет метода login. Внутри класса, который лежит в vendor/yiisoft/yii2/web вроде как тоже всё нормально. Если сделать print_r($identity), то там есть данные про юзера и возвращает он true. Но авторизация всё равно не происходит.
     
  6. mkramer

    mkramer Старожил

    С нами с:
    20 июн 2012
    Сообщения:
    4.476
    Симпатии:
    691
    Может какие-то нелады с сессионной кукой? Проблемы доменов/поддоменов? Код выглядит стандартным
     
  7. compplace

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

    С нами с:
    15 ноя 2012
    Сообщения:
    6
    Симпатии:
    0
    Только что запустил всё на локальном xampp'е и то же самое. Так что с сессией наверно нормально всё. Может со структурой базы не так что-то?
    Структура таблицы юзеров:
    Код (Text):
    1.  
    2. CREATE TABLE IF NOT EXISTS `user` (
    3. `id` int(11) NOT NULL,
    4.   `created_at` int(11) NOT NULL,
    5.   `login` varchar(255) NOT NULL,
    6.   `auth_key` varchar(32) DEFAULT NULL,
    7.   `email_confirm_token` varchar(255) DEFAULT NULL,
    8.   `pass` varchar(255) NOT NULL,
    9.   `password_reset_token` varchar(255) DEFAULT NULL,
    10.   `email` varchar(255) NOT NULL,
    11.   `rights` tinyint(1) NOT NULL,
    12.   `active` tinyint(1) NOT NULL,
    13.   `status` smallint(6) NOT NULL
    14. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;
     
    #7 compplace, 14 сен 2017
    Последнее редактирование: 14 сен 2017
  8. [vs]

    [vs] Старожил

    С нами с:
    27 сен 2007
    Сообщения:
    9.447
    Симпатии:
    341
    Адрес:
    Москва
    Сходу приходит на ум 2 варианта:
    1) банальная опечатка в имени какого-нибудь свойства или переменной, что порождает ошибку уровня Notice, которую не видно при стандартной конфигурации php. Нужно включить отображение всех ошибок
    Код (Text):
    1. ini_set('display_errors', 'on'):
    2. error_reporting(E_ALL);
    Код (Text):
    1. ini_set('display_errors', 'on'):
    2. error_reporting(E_ALL);
    2) а где собственно login action?
     
  9. compplace

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

    С нами с:
    15 ноя 2012
    Сообщения:
    6
    Симпатии:
    0
    Только что включил error_reporting и ничего нигде не выводится.
    SIteController.php action login:
    PHP:
    1. <?php
    2.  
    3. namespace app\controllers;
    4.  
    5. use Yii;
    6. use yii\filters\AccessControl;
    7. use yii\web\Controller;
    8. use yii\web\Response;
    9. use yii\filters\VerbFilter;
    10. use app\models\LoginForm;
    11. use app\models\ContactForm;
    12. use app\models\SignupForm;
    13. use app\models\User;
    14. use yii\helpers\Html;
    15. use yii\helpers\Url;
    16.  
    17. class SiteController extends Controller
    18. {
    19.     /**
    20.      * @inheritdoc
    21.      */
    22.     public function behaviors()
    23.     {
    24.         return [
    25.             'access' => [
    26.                 'class' => AccessControl::className(),
    27.                 'only' => ['logout'],
    28.                 'rules' => [
    29.                     [
    30.                         'actions' => ['logout'],
    31.                         'allow' => true,
    32.                         'roles' => ['@'],
    33.                     ],
    34.                 ],
    35.             ],
    36.             'verbs' => [
    37.                 'class' => VerbFilter::className(),
    38.                 'actions' => [
    39.                     'logout' => ['post'],
    40.                 ],
    41.             ],
    42.         ];
    43.     }
    44.  
    45.     /**
    46.      * @inheritdoc
    47.      */
    48.     public function actions()
    49.     {
    50.         return [
    51.             'error' => [
    52.                 'class' => 'yii\web\ErrorAction',
    53.             ],
    54.             'captcha' => [
    55.                 'class' => 'yii\captcha\CaptchaAction',
    56.                 'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
    57.             ],
    58.         ];
    59.     }
    60.  
    61.     /**
    62.      * Displays homepage.
    63.      *
    64.      * @return string
    65.      */
    66.     public function actionIndex()
    67.     {
    68.         return $this->render('index');
    69.     }
    70.  
    71.     /**
    72.      * Login action.
    73.      *
    74.      * @return Response|string
    75.      */
    76.     public function actionLogin()
    77.     {
    78.         if (!Yii::$app->user->isGuest) {
    79.             return $this->goHome();
    80.         }
    81.  
    82.         $model = new LoginForm();
    83.         if ($model->load(Yii::$app->request->post()) && $model->login()) {
    84.             return $this->goBack();
    85.         }
    86.         return $this->render('login', [
    87.             'model' => $model,
    88.         ]);
    89.     }
    90.  
    91.     /**
    92.      * Logout action.
    93.      *
    94.      * @return Response
    95.      */
    96.     public function actionLogout()
    97.     {
    98.         Yii::$app->user->logout();
    99.  
    100.         return $this->goHome();
    101.     }
    102.  
    103.     /**
    104.      * Displays contact page.
    105.      *
    106.      * @return Response|string
    107.      */
    108.     /*public function actionContact()
    109.     {
    110.         $model = new ContactForm();
    111.         if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app->params['adminEmail'])) {
    112.             Yii::$app->session->setFlash('contactFormSubmitted');
    113.  
    114.             return $this->refresh();
    115.         }
    116.         return $this->render('contact', [
    117.             'model' => $model,
    118.         ]);
    119.     }*/
    120.  
    121.     /**
    122.      * Displays about page.
    123.      *
    124.      * @return string
    125.      */
    126.     /*{
    127.         return $this->render('about');
    128.     }
    129.    
    130.     public function actionAddAdmin()
    131.     {
    132.     $model = User::find()->where(['login' => 'admin'])->one();
    133.     if (empty($model)) {
    134.         $user = new User();
    135.         $user->login = 'admin';
    136.         $user->email = 'admin@cupimet.ru';
    137.         $user->setPassword('7777777');
    138.         $user->generateAuthKey();
    139.         if ($user->save()) {
    140.             echo 'good';
    141.         }
    142.         print 777;
    143.     }
    144.     }*/
    145.  
    146.     public function actionSignup()
    147.     {
    148.         $model = new SignupForm();
    149.         if ($model->load(Yii::$app->request->post())) {
    150.             if ($user = $model->signup()) {
    151.                 if (Yii::$app->getUser()->login($user)) {
    152.                     return $this->goHome();
    153.                 }
    154.             }
    155.         }
    156.         return $this->render('signup', [
    157.             'model' => $model,
    158.         ]);
    159.     }
    160.  
    161.     /*
    162.      * Подтверждение подписки.
    163.      * В качестве GET-параметра принимается код, который сравнивается с тем, что в таблице subscription
    164.      * в ячейке activation. При успехе - ставится true в ячейку status.
    165.      */
    166.     public function actionActivation(){
    167.         $code = Yii::$app->request->get('code');
    168.         $code = Html::encode($code);
    169.         //ищем код подтверждения в БД
    170.         $find = User::find()->where(['email_confirm_token' => $code])->one();
    171.         if($find){
    172.             $find->active = 1;
    173.             if ($find->save()) {
    174.                 $text = '<p>Поздравляем!</p>
    175.                <p>Ваш e-mail подтвержден и регистрация завершена.</p>';
    176.                 //страница подтверждения
    177.                 return $this->render('activation', [
    178.                     'text' => $text
    179.                 ]);
    180.             }
    181.         }
    182.  
    183.         $absoluteHomeUrl = Url::home(true);
    184.         return $this->redirect($absoluteHomeUrl, 303); //на главную
    185.     }
    186. }
     
  10. compplace

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

    С нами с:
    15 ноя 2012
    Сообщения:
    6
    Симпатии:
    0
    Таки в базе проблема была... Поле status было 0, а надо 10. Тема закрыта.
     
  11. Abyss

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

    С нами с:
    12 дек 2015
    Сообщения:
    976
    Симпатии:
    141
    Адрес:
    Default city
    Так очевидно.