【问题标题】:Yii Authorization Assignment - Where does Yii get the Id?Yii 授权分配 - Yii 从哪里获得 ID?
【发布时间】:2014-11-02 22:14:23
【问题描述】:

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

我正在进入这部分:

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

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

但是,我确实发现,在我的情况下,ID 可以代替。

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

为什么是 ID 起作用,而不是用户名?我猜是因为在某个地方,我们已经从 UserIdentity 覆盖了 getId() 方法。

但是,在继续关注文档和 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],现在我很困惑。

那是什么ID?我认为是我的用户数据库表的主键。

但是 CWebUser 是如何知道我的用户数据库表(称为tbl_site_user)的。

在我的主配置文件中,我拥有的唯一配置与用户相关,并且授权是这样的:

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

Yii 是从哪里得到$auth->assign第二个参数的 ID?

【问题讨论】:

    标签: authentication yii rbac role-based-access-control


    【解决方案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 会话状态。

    【讨论】:

    • 我正在查看默认的 Yii 设置。没有模块,什么都没有。我的站点控制器上有一个操作登录。是我唯一的登录名。它不接受任何 CUserIdentity。但是,我有一种在LoginForm MODEL 下进行身份验证的方法。但是没有要求改变身份。所以,不幸的是,我不能真正按照你的步骤。 :(
    • 您只需要找到CWebUser::login(),因为这会调用CWebUser::changeIdentity 以及所有后续步骤。 Yii::app->userCWebUser 对象(默认情况下)。除非您对默认代码进行了重大更改,否则Yii::app()->user->login() 应该出现在 LoginForm 类的某个位置。
    • 找到它。 ;) 全清。非常感谢您花时间深入了解它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多