Как добавить дополнительные атрибуты сеанса идентификации пользователя в Yii2?

В Yii2 вы можете получить доступ к интерфейсу идентификации для текущего пользователя, используя объект identityInterface из класса \yii\web\User с чем-то вроде этого

 \Yii::$app->user->identity->id;

Есть ли способ получить и установить дополнительные параметры (без расширения класса идентификации)?

По сути, это эквивалент методов Yii 1.x getState() и setState() в CWebUser для хранения и извлечения информации о сеансе, подобной этой.

Yii::app()->user->setState("some_attribute",$value);
Yii::app()->user->getState('some_attribute',$defaultValue);

person Manquer    schedule 01.08.2014    source источник


Ответы (4)


Хорошо, кажется, это было удалено намеренно, чтобы избежать «путаницы». См. https://github.com/yiisoft/yii2/issues/167. Таким образом, единственный способ сделать это, напрямую вызвав класс сеанса.

\Yii::$app->session->set('user.attribute',$value);
\Yii::$app->session->get('user.some_attribute');

Поскольку теперь он хранится непосредственно в сеансе без префикса, лучше всего использовать пространство имен ключей с идентификаторами, такими как user.xxxx, чтобы избежать конфликта с каким-либо другим ключом, установленным в другой точке приложения.

person Manquer    schedule 01.08.2014

Лучший способ добавить атрибуты пользователю — создать общедоступный атрибут в вашем пользовательском классе.

class Yiidentity extends ActiveRecord implements \yii\web\IdentityInterface{
       public $awesomeAttribute = "foo";
}

Как пользоваться:

Yii::$app->user->identity->awesomeAttribute;
person Rafael Fernando Fiedler    schedule 16.07.2015
comment
На мой взгляд, это правильный ответ. Здесь нет необходимости вызывать класс сеанса. Спасибо, это было именно то, что я искал! - person gotcha; 20.08.2015
comment
Где бы вы разместили этот класс в контексте базового и расширенного приложения? Спасибо! - person johnsnails; 25.11.2016

В Yii2 \Yii::$app->user->identity содержит экземпляр identityClass. Итак, если вам нужны данные, связанные с identityClass, просто используйте их как экземпляр identityClass.

person usualdesigner    schedule 11.09.2014
comment
Не могли бы вы уточнить, как это будет сделано? Как мне создать новый атрибут для использования в другом месте приложения? - person Dubby; 13.04.2015

Вы также можете использовать функцию getter, чтобы включить дополнительную идентификационную информацию для пользователя. Например, извлеките fullname из таблицы профиля.

class User extends ActiveRecord implements \yii\web\IdentityInterface
{
    // Other code goes here...       
    public function getFullname()
    {
        $profile = Profile::find()->where(['user_id'=>$this->id])->one();
        if ($profile !==null)
            return $profile->fullname;
        return false;
    }
}

Затем вы можете использовать его, как если бы у вас был атрибут с именем fullname, например

Yii::$app->user->identity->fullname;
person Osh Mansor    schedule 23.03.2016