1

我正在尝试实现我的第一个 RBAC 系统:

我要讲这部分:

在官方文档中,他们有一个用户名示例:

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

但是,我确实发现,就我而言,ID 会起作用。

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

为什么 ID 有效,而不是用户名?我推测这是因为在某个地方,我们已经覆盖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 第二个参数中是从哪里得到 ID 的?

4

1 回答 1

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 对象,从中提取 id,并调用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会话状态。

于 2014-09-10T00:17:51.933 回答