CakePHP:Warning(512):Model“;“用户”;与“模型”不关联;“用户”;Windows到Ubuntu的部署
我正在尝试部署一个cakePHP应用程序,它完全可以在Windows中正常工作。 我使用LdapUser模型通过Active Directory进行身份验证: LdapUser:CakePHP:Warning(512):Model“;“用户”;与“模型”不关联;“用户”;Windows到Ubuntu的部署,windows,cakephp,ubuntu,ldap,containable,Windows,Cakephp,Ubuntu,Ldap,Containable,我正在尝试部署一个cakePHP应用程序,它完全可以在Windows中正常工作。 我使用LdapUser模型通过Active Directory进行身份验证: LdapUser: <?php class LdapUser extends AppModel { var $name = 'LdapUser'; var $useTable = false; var $myCompany_ldap = "x.x.x.x"; //var $myCompany_ldap_config = array
<?php
class LdapUser extends AppModel
{
var $name = 'LdapUser';
var $useTable = false;
var $myCompany_ldap = "x.x.x.x";
//var $myCompany_ldap_config = array ('basedn' => 'CN=x,DC=x,DC=x');
var $basedn = 'CN=x,DC=x,DC=x';
var $myCompany_ldap_domain = "x.x";
// var $user = "x@x.x";
// var $pass = "x!";
var $exists = false;
var $ds;
function __construct()
{
parent::__construct();
ini_set('max_execution_time', 300); //300 seconds = 5 minutes
$this->ds=ldap_connect( $this->myCompany_ldap );
// print_r($this->basedn);
// debug($this->ds);
// print_r($this->ds);
ldap_set_option($this->ds, LDAP_OPT_PROTOCOL_VERSION, 3);
print_r($this->res);
//debug($this->exists);
//print_r($this->exists);
}
function __destruct()
{
ldap_close($this->ds);
// $this->loadModel('Cookie');
// $this->Cookie->destroy();
}
function isConnected(){
return ldap_bind($this->ds, $this->basedn);
}
function isLdapUser($user, $pass){
$this->exists = ldap_bind($this->ds, $user, $pass);
// debug($this->exists);
//debug($user);
// debug($pass);
return $this->exists;
}
}
我得到:
Warning (2): ldap_bind() [http://php.net/function.ldap-bind]: Unable to bind to
server: Invalid credentials [APP/Model/LdapUser.php, line 56]
Warning (512): Model "User" is not associated with model "User" [CORE/Cake/Model
/Behavior/ContainableBehavior.php, line 339]
我的猜测是,这可能是platofrms之间区分大小写的问题,但在Ubuntu中不起作用真的很麻烦
[已编辑]这是我的用户模型:
<?php
App::uses('AuthComponent', 'Controller/Component');
class User extends AppModel {
public $name = 'User';
var $actsAs = array('Containable');
// Define which database to use
var $useDbConfig = 'myDb';
// Many-To-One relationship
var $belongsTo = array('Role');
// validation of input data
public $validate = array(
'username' => array(
'required' => array(
'rule' => 'notEmpty',
'message' => 'A username is required'
),
'isUnique' => array (
'rule' => 'isUnique',
'message' => 'This username already exists'
)
),
'password' => array (
'not_empty' => array (
'rule' => 'notEmpty',
'message' => 'The field "Password" cannot be empty'
),
'between_chars' => array (
'rule' => array ('between', 4, 10),
'message' => 'Password must be between 4 and 10 chars'
)
),
'passwordVerify' => array(
'not_empty' => array (
'rule' => 'notEmpty',
'message' => 'The field "Confirm Password" cannot be empty'
),
'match_password' => array (
'rule' => 'matchPasswords',
'message' => '"Confirm Password" must be the same as "Password"'
)
),
'name' => array(
'required' => array(
'rule' => array('notEmpty'),
'message' => 'A name is required'
)
),
'surname' => array(
'required' => array(
'rule' => array('notEmpty'),
'message' => 'A surname is required'
)
),
'role_id' => array(
'valid' => array(
'rule' => 'notEmpty',
'message' => 'Please enter a valid role',
'allowEmpty' => false
)
),
'oldPassword' => array (
'match_password' => array (
'rule' => 'matchOldPassword',
'message' => 'Invalid password'
),
'required' => array (
'rule' => 'requiredOldPassword',
'message' => '"Current Password" is required if you wish to edit the password'
)
),
'newPassword' => array (
'required' => array (
'rule' => 'requiredNewPassword',
'message' => '"New Password" is required if you wish to edit the password'
),
'between_chars' => array (
'rule' => 'lengthNewPassword',
'message' => 'Password must be between 4 and 10 chars'
)
),
'newPasswordVerify' => array (
'required' => array (
'rule' => 'requiredNewPasswordVerify',
'message' => '"Confirm Password" is required if you wish to edit the password'
),
'match_password' => array (
'rule' => 'matchNewPasswordVerify',
'message' => '"Confirm Password" must be the same as "New Password"'
)
)
);
// Verify that password and password verification match when creating a new user
public function matchPasswords ($data) {
if ($this->data['User']['password'] == $this->data['User']['passwordVerify']) {
return true;
} else {
return false;
}
}
public function matchOldPassword ($data) {
if (!empty($this->data['User']['oldPassword'])){ // when an input is given for
'oldPassword'...
if ($_SESSION['User']['User']['password'] ==
AuthComponent::password($this->data['User']['oldPassword'])) { // when password
is correct (equal to 'password')
return true;
} else { // when password is invalid (not equal to 'password')
return false;
}
}
return false; // default value when 'oldPassword' is empty
}
// Verify that a value for 'oldPassword' (current password) is given when
'newPassword' or 'newPasswordVerify' are also given during the procedure of
editing the password
public function requiredOldPassword ($data) {
if (!empty($this->data['User']['newPassword']) || !empty($this->data['User']
['newPasswordVerify'])){ // when an input is given for 'newPassword' or
'newPasswordVerify'...
if (!empty($this->data['User']['oldPassword'])){ // when an input is given for
oldPassword...
return true;
} else { // when no input is given for oldPassword...
return false;
}
}
return false; // default value when 'newPassword' and 'newPasswordVerify'
are left empty
}
// Verify that a value for 'newPassword' (current password) is given when
public function requiredNewPassword ($data) {
if (!empty($this->data['User']['oldPassword']) ||
!empty($this->data['User']['newPasswordVerify'])){ // when an input is given for
'oldPassword' or 'newPasswordVerify'...
if (!empty($this->data['User']['newPassword'])){
return true;
} else { // when no input is given for newPassword...
return false;
}
}
return false;
}
// Verify that 'newPassword' has an appropriate length
public function lengthNewPassword ($data) {
if (!empty($this->data['User']['newPassword'])) { )>=4 && .
strlen($this->data['User']['newPassword'])<=10){ // when length is valid..
return true;
} else { // when length is invalid...
return false;
}
}
return false; // default value when 'newPassword' is left empty
}
public function matchNewPasswordVerify ($data) {
if ($this->data['User']['newPassword'] == $this->data['User']
['newPasswordVerify']) {
return true;
} else {
return false;
}
}
public function requiredNewPasswordVerify ($data) {
if (!empty($this->data['User']['oldPassword']) ||
!empty($this->data['User']['newPassword'])){ // when an input is given for
'oldPassword' or 'newPassword'...
if (!empty($this->data['User']['newPasswordVerify'])){ // when an
return true;
} else { // when no input is given for newPasswordVerify...
return false;
}
}
return false; // default value when 'oldPassword' and 'newPassword' are left empty
}
// Password stored with SHA1 (cakePHP default) or MD5 hashing algorithm
public function beforeSave($options = array()) {
if (isset($this->data[$this->alias]['password'])) {
$this->data[$this->alias]['password'] =
AuthComponent::password($this->data[$this->alias]['password']);
//$this->data['User']['password'] = md5($this->data['User']
['password']); // MD5 hashing algorithm
}
return true;
}
var $hasMany = array(
'MspDashboard' => array(
'className' => 'MspDashboard',
'foreignKey' => 'user_id',
'dependent' => false,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'exclusive' => '',
'finderQuery' => '',
'counterQuery' => ''
)
);
}
关于512相关错误:
$this->User->contain(array('User', 'Role' => array('Ui', 'Action.name')));
改为:
$this->User->contain(array('Role' => array('Ui', 'Action.name')));
不要包含模型本身
关于LDAP错误,似乎是这样一行:
$this->exists = ldap_bind($this->ds, $user, $pass);
我将从以下代码开始调试:
var_dump($this->ds);
var_dump($user);
var_dump($pass);
$this->exists = ldap_bind($this->ds, $user, $pass);
将此数据复制粘贴到某个LDAP工具中,并首先验证它们是否正确
请尝试此函数以获取更多错误信息:
好的,谜团已经解开:
警告与此无关:
这行代码是错误提示:
if ($this->isLdapUser || 'tsc' ) {
.......
用户tsc是本地数据库中的管理员,在ldap中不存在,因此肯定会从ldap_绑定中获得超时,看起来Ubuntu平台会在浏览器超时时使我的应用程序崩溃。相反,我的本地计算机将在超时期间等待并继续登录
我刚刚修改了我的代码,所以管理员用户“tsc”
将直接登录,无需通过ldap验证。Hi,您是否检查了传递给ldap\u绑定的值?似乎它可能会得到错误的值,甚至可能与cakephp无关。如果关于用户模型的警告仍然存在,请发布一些用户模型的代码。问题是,一切都可以在windows中运行,但部署linux apache会生成此警告并冻结页面。我没有看到任何致命的错误,虽然…将无法通过登录页面。当谈到ldap_bind()时,是的,我已经检查过了,但是即使ldap_bind失败,代码仍然可以工作。如果用户名='tsc'刚刚编辑了我的帖子,您可以看到用户模型代码。您好,刚刚编辑了我的帖子,我相信警告不是实际问题。您是否进行了修复并获得了答案中提到的调试信息?我不知道你为什么认为这不是真正的问题,但无论如何,这两个问题都需要解决。调试级别1和2基本相同,只是2显示sql日志。不需要直接解决您的问题。在继续处理其他问题之前,您需要先修复这两个错误。因为我已经消除了警告,所以您正确地回答了我的问题。。。我想我应该发布其他标题,因为我的问题仍然存在。反正是Thx!Tnx只是尝试一下,研究了一下,ldap_connect存在很多问题。也许一个好的谷歌研究可以很快解决这个问题。否则,请发布一个新问题,其中包含特定代码、LDAP服务器和PHP版本的配置详细信息。答案是100%帮助。毕竟,警告必须纠正。它以一种我无法想象的方式困扰着我!我再也不会无视警告了!谢谢
if ($this->isLdapUser || 'tsc' ) {
.......