花了一些时间来理解你想要什么。所以基本上它就像:
- 用户尝试使用用户名/密码登录
- 要对用户进行身份验证,请检查是否可以使用与数据库凭据相同的用户名/密码建立数据库连接
- 如果可以打开连接,则用户应该有一个
db
可用的组件,该组件在整个用户会话中使用相同的连接凭据
您创建自定义的方法UserIdentity
是正确的。它们用于进行身份验证。我不确定,为什么你的代码失败了,但你在正确的轨道上。也许getConnectionStatus()
不适用于 Oracle。您可以尝试执行另一个简单的 SQL 命令进行测试。
如果您设法测试连接是否成功,则应将username
and存储password
在用户会话中,例如
Yii::app()->user->setState('__db_username',$this->username);
Yii::app()->user->setState('__db_password',$this->password);
现在让db
组件在登录后可用有点棘手。你可以采取不同的方法。我将描述两个:
1.创建自定义CDbConnection
class DynamicDbConnection extends CDbConnection
{
public function init()
{
$this->username = Yii::app()->user->getState('__db_username');
$this->password = Yii::app()->user->getState('__db_password');
if(!$this->username || !$this->password) {
throw new CException('No username/password available! User not logged in?');
}
parent::init();
}
}
现在,您可以在没有db
用户名和密码的情况下将其配置为组件,当然:main.php
'components' => array(
'db' => array(
'class' => 'DynamicDbConnection',
'connectionString' =>'oci:dbname=XE;charset=UTF8',
),
),
2. 从 Controller::init() 添加一个 CDbConnection
db
您可以从基本控制器init()
方法中添加一个组件:
class Controller extends CController
{
public function init()
{
$username = Yii::app()->user->getState('__db_username');
$password = Yii::app()->user->getState('__db_password');
if($username && $password) {
Yii::app()->setComponent('db', array(
'username' => $username,
'password' => $password,
));
}
parent::init();
}
为此,您还需要一个基本db
组件配置。main.php
这两种方法可能都需要稍作调整,因为我没有对此进行测试。但是你应该得到基本的想法。