あなたが何を望んでいるかを理解するのに少し時間がかかりました。したがって、基本的には次のようになります。
- ユーザーがユーザー名/パスワードでログインしようとしています
- ユーザーを認証するには、DB資格情報と同じユーザー名/パスワードを使用してDB接続を確立できるかどうかを確認します
- 接続を開くことができる場合、ユーザーは
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
コンポーネントを利用できるようにするのは少し難しいです。さまざまなアプローチを取ることができます。次の 2 つについて説明します。
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
。
私はこれをテストしていないので、どちらのアプローチも少し調整する必要があるかもしれません。しかし、あなたは基本的な考え方を理解する必要があります。