簡體   English   中英

Yii數據庫連接問題

[英]Yii database connection issue

任務

我需要的是基於Oracle DB用戶系統對用戶進行身份驗證:

  • 用戶進入登錄頁面
  • 輸入用戶名和密碼
  • 應用程序嘗試與給定參數建立連接
  • 如果成功,則使該連接在應用程序上持久

我正在使用Yii框架。

我做了什么...

我從protected/config/main.php文件中刪除了db組件。 根據拉里·烏爾曼(Larry Ulman)的博客文章,authenticate (位於protected/components/UserIdentity.php )替換為以下一個

public function authenticate()
{
 $dsn='oci:dbname=XE;charset=UTF8';
 $connection=new CDbConnection($dsn,$this->username,$this->password);
 $connection->active=true;
 return $connection->getConnectionStatus();
}

嗯,它沒有建立任何連接。 我在使用oracle客戶端測試的服務器中的順便說一句。 一切正常。

問題是

  1. 我不確定我的做法是否正確。
  2. 如何使建立的數據庫連接在整個應用程序中持久化?

BTW

我的開發環境在Windows Server 2003上運行Oracle DB和Apache 2.2.4 + PHP 5.4 Web服務器。

花了一些時間來了解您想要什么。 所以基本上就像:

  • 用戶嘗試使用用戶名/密碼登錄
  • 要驗證用戶身份,請檢查是否可以使用數據庫憑據相同的用戶名/密碼來建立數據庫連接。
  • 如果可以打開連接,則用戶應該有一個可用的db組件,該組件在整個用戶會話中都使用相同的連接憑據

您創建自定義UserIdentity是正確的。 它們用於進行身份驗證。 我不確定為什么您的代碼在那里失敗,但是您的方向正確。 也許getConnectionStatus()不適用於Oracle。 您可以嘗試執行另一個簡單的SQL命令進行測試。

如果您已成功測試連接成功,則應將usernamepassword存儲在用戶會話中,例如

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();
     }
}

現在,您當然可以在main.php將此配置為db組件, 而無需用戶名和密碼,當然:

'components' => array(
    'db' => array(
        'class' => 'DynamicDbConnection',
        'connectionString' =>'oci:dbname=XE;charset=UTF8',
    ),
 ),

2.從Controller :: init()添加CDbConnection

您可以從基本控制器的init()方法添加db組件:

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();
   }

為此,在main.php ,您仍然需要基本的db組件配置。

兩種方法可能都需要稍作調整,因為我尚未對此進行測試。 但是您應該了解基本思想。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM