0

仕事

私が必要としているのは、Oracle DB ユーザー システムに基づいてユーザーを認証することです。

  • ユーザーがログインページに入る
  • ユーザー名とパスワードを入力します
  • アプリケーションは、指定されたパラメーターで接続を確立しようとします
  • 成功した場合、この接続をアプリケーション上で永続化します

Yii フレームワークを使用しています。

私がやったこと...

dbコンポーネントをprotected/config/main.phpファイルから削除しました。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. 確立されたデータベース接続をアプリケーション全体で永続化するには?

ところで

Windows Server 2003 で動作する私の開発環境 Oracle DB と Apache 2.2.4 + PHP 5.4 Web サーバー。

4

1 に答える 1

1

あなたが何を望んでいるかを理解するのに少し時間がかかりました。したがって、基本的には次のようになります。

  • ユーザーがユーザー名/パスワードでログインしようとしています
  • ユーザーを認証するには、DB資格情報と同じユーザー名/パスワードを使用してDB接続を確立できるかどうかを確認します
  • 接続を開くことができる場合、ユーザーはdb、ユーザー セッション全体でこの同じ接続資格情報を使用するコンポーネントを使用できる必要があります。

カスタムを作成するためのあなたのアプローチUserIdentityは正しいです。それらは認証を行うためのものです。コードが失敗する理由はわかりませんが、正しい方向に進んでいます。たぶんgetConnectionStatus()、Oracle では正しく動作しません。テスト用に別の単純な SQL コマンドを実行してみることができます。

成功した接続をテストできた場合は、ユーザーセッションにusernameandを保存する必要があります。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

私はこれをテストしていないので、どちらのアプローチも少し調整する必要があるかもしれません。しかし、あなたは基本的な考え方を理解する必要があります。

于 2013-08-06T16:22:51.027 に答える