我目前正在使用CakePHP(版本2.4)编写数据库访问应用程序。出于安全原因,我只有权阅读数据库("数据库")。因此,我别无选择,只能为我的登录系统和其他一些应用程序数据使用另一个数据库("应用程序数据库")。
这是一个数据库访问应用程序,超过80%的代码与数据库相关,因此我希望保持与数据库的默认数据库连接。对于我自己编写的模型,我知道我可以设置要使用的数据库:
public $useDbConnect = $applicationDatabase;
$ loginDatabase是我的应用程序数据库的数据库配置。它已添加到配置中。
问题是,我正在使用Cakephp的authComponent作为我的登录系统,该组件的默认设置是使用默认的数据库连接。所以,当我打电话时
$this->Auth->loggedIn(); //to check if the user have logged in or not
在任何控制器中,它都会显示错误代码:
Error: Call to a member function loggedIn() on a non-object
当我在用户控制器中调用AuthComponent时,我发现了实际问题:
$this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
这是保存之前哈希密码的行(也用于cakephp官方网站上的官方指南。)并且它给出了以下错误:
缺少数据库连接
错误:使用" Mysql"的数据库连接丢失或无法连接。
数据库服务器返回此错误:SQLSTATE [HY000] [2002]无法建立连接,因为目标计算机主动拒绝 它注意:如果要自定义此错误消息,请创建app \ View \ Errors \ missing_connection.ctp
那么,回到问题:有没有办法改变用于AuthComponent的数据库设置?
答案 0 :(得分:1)
首先,要解析Error: Call to a member function loggedIn() on a non-object
,您需要将$components = array('Auth', 'Session');
添加到AppController。
要回答您的下一个问题,AuthComponent不会设置数据库配置来验证用户身份。它将使用“用户”模型使用的数据库表。 因此,将以下内容添加到User.php模型中:
public $useDbConfig = 'loginDatabase';
确保您拥有一个数据库,其中users
表填充了用户名和密码。另外,如您的问题中所述,将loginDatabase配置正确添加到Config/database.php
文件。
public $loginDb = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'somehost',
'login' => 'someusername',
'password' => 'somepassword',
'database' => 'login_database', //this database should have your users table
);