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. 如何使已建立的数据库连接在整个应用程序中持久化?

顺便提一句

我的开发环境 Oracle DB 和 Apache 2.2.4 + PHP 5.4 网络服务器在 Windows Server 2003 上运行。

4

1 回答 1

1

花了一些时间来理解你想要什么。所以基本上它就像:

  • 用户尝试使用用户名/密码登录
  • 要对用户进行身份验证,请检查是否可以使用与数据库凭据相同的用户名/密码建立数据库连接
  • 如果可以打开连接,则用户应该有一个db可用的组件,该组件在整个用户会话中使用相同的连接凭据

您创建自定义的方法UserIdentity是正确的。它们用于进行身份验证。我不确定,为什么你的代码失败了,但你在正确的轨道上。也许getConnectionStatus()不适用于 Oracle。您可以尝试执行另一个简单的 SQL 命令进行测试。

如果您设法测试连接是否成功,则应将usernameand存储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

这两种方法可能都需要稍作调整,因为我没有对此进行测试。但是你应该得到基本的想法。

于 2013-08-06T16:22:51.027 回答