yupe/yupe — pull request #1035 by DexterHD (2013-05-31 14:22:37+00:00)
Title: #1030 Исправлена ошибка аутерификации 

В кратце, суть ошибки в следующем:

В Yii есть класс CUserIdentity и CWebUser. Первый используется для аутентификации. Второй используется для работы с пользователем и его настройками. Будь то гость или авторизованный пользователь. У обоих классов есть метод setState();

В нашем случае использовался метод класса CWebUser, что и вызвало ошибку.
Вместо этого нужно было использовать метод класса CUserIdentity, который как раз таки нужен для того, чтобы передать дополнительные параметры во время авторизации, которые запишутся в cookie. В метод CWebUser::login передается экземпляр CUserIdentity из которого извлекаются записанные туда параметры и после внутри метода CWebUser::saveToCookie() происходит сохранение этих параметров.

```php
public function login($identity,$duration=0)
{
$id=$identity->getId();
// Вот здесь мы получаем у экземпляра CUserIdentity параметры установленные методом CUserIdentity::setState();
$states=$identity->getPersistentStates();
if($this->beforeLogin($id,$states,false))
{
// Внутри этого метода данные параметры разбираются и записываются в экземпляр текущего класса. В элемент массива с идентификатором "__states".
$this->changeIdentity($id,$identity->getName(),$states);

if($duration>0)
{
if($this->allowAutoLogin)
// А внутри этого метода параметры извлекаются из элемента массива и сохраняются в Cookie.
$this->saveToCookie($duration);
else
throw new CException(Yii::t('yii','{class}.allowAutoLogin must be set true in order to use cookie-based authentication.',
array('{class}'=>get_class($this))));
}

$this->afterLogin(false);
}
return !$this->getIsGuest();
}
```

В последствии во время инициализации класса CWebUser в методе init вызываются методы внутри которых происходит извлечение всех параметров из cookies и вызов метода CWebUser::setState(); для каждого из них.

Метод класса CWebUser::setState(); нужен для установки дополнительных параметров именно для текущей сессии пользователя. Данные установленные при помощи него сохраняются в сессию и пропадают при выходе из браузера, в cookie они не пишутся.