Yii:使用模块特定的数据库进行访问控制

时间:2012-01-14 19:22:22

标签: database module yii access-control

我正在尝试为将通过Yii模块访问我的网站的特殊用户组建立一个单独的数据库,但我似乎无法正确配置。

以下是我的模块heirarchy的相关文件。

/protected/modules/special
/protected/modules/special/SpecialModule.php
/protected/modules/special/models/SpecialActiveRecord.php
/protected/modules/special/models/Account.php
/protected/modules/special/components/UserIdentity.php

根据说明here,我更新了我的main.config以包含模块特定的数据库定义。

'modules'=>array(
    'special'=>array(
        'db'=>array(
            'connectionString'=>'mysql:dbname=specialdatabase',
            'username'=>'special',
            'password'=>'special',
        ),
    ),
),

我还通过将public $db添加到SpecialModule.php来更新我的模块以支持数据库定义,并且我创建了一个利用数据库定义的模块特定活动记录。

class SpecialActiveRecord extends CActiveRecord
{
    public function getDbConnection()
    {
        $db = Yii::app()->controller->module->db;
        return Yii::createComponent($db);
    }
}

我遇到问题的地方是帐户模型。我的主Web应用程序还实现了一个帐户模型,堆栈跟踪显示模块正在通过用户身份(/protected/modules/special/components/UserIdentity.php)访问我的所有模块特定文件。但是,用于授权的帐户模型在站点级别(/protected/models/Account.php)引用。

有关使用模块特定数据库实现模块特定身份验证的正确方法的任何想法吗?

1 个答案:

答案 0 :(得分:3)

基于Yii网站上的论坛帖子(我现在似乎无法找到),我通过在模块模型中添加前缀来克服这个问题 - 例如。 SAccount.phpSActiveRecord.php

此外,我必须对getDbConnection例程进行微小的修改以激活数据库,并使所有内容在Yii 1.0中运行(1.1可能不是这种情况)。在这里,我修改了CActiveRecord类的代码。

class SActiveRecord extends CActiveRecord
{
    public function getDbConnection()
    {
        if(self::$db!==null)
            return self::$db;
        else
        {
            $db = Yii::app()->controller->module->db;
            self::$db=Yii::createComponent($db);
            if(self::$db instanceof CDbConnection)
            {
                self::$db->setActive(true);
                return self::$db;
            }
            else
                throw new CDbException(Yii::t('yii','Special Active Record requires a "db" CDbConnection application component.'));
        }
    }
}