Назначение авторизации Yii — откуда Yii получает идентификатор?

Я пытаюсь реализовать свою первую систему RBAC:

Я добираюсь до этой части:

В официальной документации у них есть пример с именем пользователя:

$auth->assign('adminRole', 'userA'); 
$auth->assign('adminRole', 'userB');

Однако я обнаружил, что в моем случае вместо этого будет работать идентификатор.

$auth->assign('adminRole', '8'); 
$auth->assign('adminRole', '9');

Почему сработал идентификатор, а не имя пользователя? Я предположил, что это произошло из-за того, что где-то мы перезаписали метод getId() из UserIdentity.

Однако, следуя документации и коду Yii, я заметил, что метод assign() не принимает дочерний элемент CUserIdentity, вместо этого он использует интерфейс IWebUser.

Затем я перехожу к CWebUser и замечаю, что метод getId() имеет следующее:

/**
     * Returns a value that uniquely represents the user.
     * @return mixed the unique identifier for the user. If null, it means the user is a guest.
     */
    public function getId()
    {
        return $this->getState('__id');
    }

Я продолжаю следить за этим, и я в конечном итоге на $_SESSION[$key], и теперь я запутался.

Что это за идентификатор? Я предполагаю, что это первичный ключ моей пользовательской таблицы базы данных.

Но откуда CWebUser знает о моей пользовательской таблице базы данных (которая называется tbl_site_user), кстати.

Единственная конфигурация, которая у меня есть, связана с пользователем и авторизацией в моем основном файле конфигурации:

'authManager'=>array(
            'class'=>'CDbAuthManager',
            'connectionID'=>'db',
        ), 

Откуда Yii взял идентификатор $auth->assign второго аргумента?


person MEM    schedule 09.09.2014    source источник


Ответы (1)


В какой-то момент кода вы вызываете CWebUser::login(), наверное с Yii::app()->user->login($identity);.

public function login($identity,$duration=0)
{
    $id=$identity->getId();
    $states=$identity->getPersistentStates();
    if($this->beforeLogin($id,$states,false))
    {
        $this->changeIdentity($id,$identity->getName(),$states);
...

Этот метод принимает ваш объект CUserIdentity, извлекает из него идентификатор и вызывает CWebUser: :changeIdentity().

protected function changeIdentity($id,$name,$states)
{
    Yii::app()->getSession()->regenerateID(true);
    $this->setId($id);
    $this->setName($name);
    $this->loadIdentityStates($states);
}

Где вызывается CWebUser::setId().

public function setId($value)
{
    $this->setState('__id',$value);
}

Который устанавливает состояние сеанса __id.

person Willem Renzema    schedule 10.09.2014
comment
Я смотрю на настройку Yii по умолчанию. Никаких модулей, ничего. У меня есть вход в систему на моем контроллере сайта. Это единственный логин, который у меня есть. Он не принимает CUserIdentity. Однако у меня есть метод аутентификации под LoginForm MODEL. Но нет призыва к changeIdentity. Так что, к сожалению, я не могу следить за вашими шагами. :( - person MEM; 10.09.2014
comment
Вам просто нужно найти CWebUser::login(), так как это вызывает CWebUser::changeIdentity и все последующие шаги. Yii::app->user — это объект CWebUser (по умолчанию). Если вы не внесли серьезные изменения в код по умолчанию, Yii::app()->user->login() должен появиться где-то в классе LoginForm. - person Willem Renzema; 10.09.2014
comment
Найди это. ;) Все чисто. Большое спасибо, что нашли время, чтобы углубиться в это. - person MEM; 10.09.2014