草庐IT

windows - CakePHP:警告 (512):模型 "User"与模型 "User"无关 Windows 到 Ubuntu 部署

coder 2024-06-21 原文

我正在尝试部署一个 cakePHP 应用程序,它可以在 Windows 中正常工作。 我使用 LdapUser 模型通过 Active Directory 进行身份验证:

Ldap 用户:

<?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;

  } 

 } 

然后在 UserController 里面的登录函数:

    // Login User
public function login() {

    // Check if the user is already logged in
    if ($this->Session->check('Auth.User.id')){ 

        // Redirect to login page
        $this->redirect($this->Auth->loginRedirect); 
    }
    else{
        // If the user is not logged in


        session_set_cookie_params(0); 

        // If the request is a POST request
        if ($this->request->is('post')) { 
            //get credentials
            $this->username = $this->request->data['User']['username'];
            $this->password = $this->request->data['User']['password'];
            $this->domain = $this->request->data['User']['domain'];
            //debug($this->username);
            debug($this->domain) ;

            if ($this->Auth->login() ) { 
                // Successful login
                //Check if specific user exists in LDAP:
                $this->loadModel('LdapUser');

                $this->ds = $this->LdapUser->isConnected();
                //print_r('Ldap status: '. $this->ds);
                //debug($this->ds) ;
                //echo $this->ds;

                $this->isLdapUser =
                                     $this->LdapUser->isLdapUser($this->username .

                //debug($this->isLdapUser);
if ( $this->username =='tsc' || $this->ds  ){ 
if ($this->isLdapUser ||     'tsc' ) {
// Get all the user information and store in Session
$this->User->id = $this->Auth->user('id');
$this->User->contain(array('User', 'Role' => array('Ui', 'Action.name')));
$this->Session->write('User', $this->User->read());

$actions = array();
foreach ($this->Session->read('User.Role.Action') as $key => $value){
     array_push($actions, $value['name']);
                        }
$this->Session->write('User.Role.Action', $actions);

// Render different layout depending on user type
if($this->Session->read('User.Role.Ui.name') == Configure::read('usertype.msp')){
    $this->Session->write('SessionValues.ui', Configure::read('usertype.msp'));
$this->Auth->loginRedirect = array('controller' => 'PortStats', 'action' => 
    'index');
}
else if($this->Session->read('User.Role.Ui.name') == 
    Configure::read('usertype.tsc')){
     $this->Session->write('SessionValues.ui', Configure::read('usertype.tsc'));

$this->Auth->loginRedirect = array('controller' => 'PortStats', 'action' => 
    'index');
}
else if($this->Session->read('User.Role.Ui.name') == 
    Configure::read('usertype.superAdminUserType')){
$this->Auth->loginRedirect = array('controller' => 'uis', 'action' => 'index');
                        }

    // Redirect to main login page
    $this->redirect($this->Auth->loginRedirect);


}
else {
// Failed login
session_destroy();
$this->Session->setFlash(__('Login failed: access not granted'), 'default', 
    array(), 'fail');

    }

    }
else {


// Failed login
session_destroy();
$this->Session->setFlash(__('Login failed: LDAP out of reach'), 'default', 
array(), 'fail');               
}
} 
else { 

// Failed login
$this->Session->setFlash(__('Invalid username or password, please try again'), 
'default', array(), 'fail');                
            }
        }
    }
}

我得到:

    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' => ''
    )
);
   }

[编辑]: 我倾向于认为警告不对我的问题负责: 它出现在两个平台中,但不应中断网站的功能。

所以当在调试级别 = 2 的 Windows 中时,我看到:

但是在 ubuntu 中,它看起来有问题,我得到的只是这个屏幕:

最佳答案

关于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 工具中,并首先验证它们是否正确。

试试这个函数来获取更多的错误信息: http://php.net/manual/en/function.ldap-error.php

关于windows - CakePHP:警告 (512):模型 "User"与模型 "User"无关 Windows 到 Ubuntu 部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18537109/

有关windows - CakePHP:警告 (512):模型 "User"与模型 "User"无关 Windows 到 Ubuntu 部署的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  3. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  4. ruby - 在 Ruby 中实现 `call_user_func_array` - 2

    我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)

  5. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  6. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  7. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  8. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  9. ruby - 在院子里用@param 标签警告 - 2

    我试图使用yard记录一些Ruby代码,尽管我所做的正是所描述的here或here#@param[Integer]thenumberoftrials(>=0)#@param[Float]successprobabilityineachtrialdefinitialize(n,p)#initialize...end虽然我仍然得到这个奇怪的错误@paramtaghasunknownparametername:the@paramtaghasunknownparametername:success然后生成的html看起来很奇怪。我称yard为:$yarddoc-mmarkdown我做错了什么?

  10. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

随机推荐