任务
我需要的是,基于Oracle数据库用户系统对用户进行身份验证:
- 用户进入登录页面
- 输入用户名和密码
- 应用程序尝试与给定参数建立连接
- 如果成功,则通过应用程序使此连接持久化
我正在使用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();
}
它没有建立任何联系。BTW在服务器上,我用oracle客户端进行了测试。一切都很好。
问题是
- 我不确定我做这件事的方式是否正确
- 如何使已建立的数据库连接在整个应用程序上持久
BTW
我的发展环境在Windows Server 2003上运行的Oracle DB和Apache 2.2.4+PHP 5.4 Web服务器。
了解您想要什么需要一些时间。所以基本上就像:
- 用户尝试使用用户名/密码登录
- 要对用户进行身份验证,请检查是否可以使用与数据库凭据相同的用户名/密码来建立数据库连接
- 如果可以打开连接,则用户应该有一个可用的
db
组件,该组件在整个用户会话中使用相同的连接凭据
您创建自定义UserIdentity
的方法是正确的。它们用于进行身份验证。我不确定你的代码为什么会失败,但你走在了正确的轨道上。也许getConnectionStatus()
不适合Oracle。您可以尝试为测试执行另一个简单的SQL命令。
如果您成功地测试了连接,那么应该将username
和password
存储在用户会话中,例如
Yii::app()->user->setState('__db_username',$this->username);
Yii::app()->user->setState('__db_password',$this->password);
现在要在登录后提供db
组件有点棘手。你可以采取不同的方法。我将描述两个:
1.创建自定义CDb连接
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.添加来自控制器的CDbConnection::init()
您可以从基本控制器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
组件配置。
这两种方法可能都需要一些调整,因为我还没有测试过。但你应该了解基本的想法。