Cake PHP2.4.x。AuthComponent login()始终返回true

bal

很长的问题很抱歉,但是我在使用auth-> login()时遇到了问题,经过长时间的调试,我想分享一下我的发现。这可能是我这边的愚蠢之举,但请​​忍受...

型号“客户”(相关零件):

<?php
App::uses('AppModel', 'Model');
App::uses('BrValidation', 'Localized.Validation');
App::uses('AuthComponent', 'Controller/Component');
App::uses('SimplePasswordHasher', 'Controller/Component/Auth');

/**  
* Cliente Model
*
*/
class Cliente extends AppModel {
    public $primaryKey = 'idcliente';

public function beforeSave($options = array()) {
    if (isset($this->data[$this->alias]['password'])) {
        $passwordHasher = new SimplePasswordHasher();
        $this->data[$this->alias]['password'] = $passwordHasher->hash(
            $this->data[$this->alias]['password']
        );
    }
    return true;
}
}

ClientesController(相关部分):

<?php
App::uses('AppController', 'Controller');
App::uses('CakeEmail', 'Network/Email');

/**
* Clientes Controller
*
*/
class ClientesController extends AppController {

public $components = array('Paginator','RequestHandler');

/** beforeFilter
*  Configura partes do sistema que podem ser acessadas sem login
*/ 

public function beforeFilter() {
    //parent::beforeFilter();
    //$this->Auth->allow();
}
public function login() {

    //if already logged-in, redirect
    if($this->Session->check('Auth.Cliente')){
        $this->redirect(array('action' => 'index'));      
    }

    // if we get the post information, try to authenticate
    if ($this->request->is('post')) {
        CakeLog::write('debug',"POS IF POST\n");
        if ($this->Auth->login()) {
            CakeLog::write('debug',"True no LOGIN\n");
            $this->Session->setFlash(__('Welcome, '. $this->Auth->user('Cliente.username')));
            $this->redirect($this->Auth->redirectUrl());
        } else {
            $this->Session->setFlash(__('Invalid username or password'));
        }
    } 
}

AppController(相关零件)类AppController扩展了控制器{

public $components = array(
    'DebugKit.Toolbar',
    'Session',
    'Auth' => array(
        'loginAction' => array('controller' => 'clientes', 'action' => 'login'),
        'loginRedirect' => array('controller' => 'clientes', 'action' => 'poslogin'),
        'logoutRedirect' => array('controller' => 'clientes', 'action' => 'login'),
        'authError' => 'Você precisa se logar para ver esta página.',
        'loginError' => 'Usuário ou senha inválidos.  Tente de novo.',
        'authenticate' => array(
        'Form' => array(
            'userModel' => 'Cliente',
            'fields' => array ( 'username' => 'username', 'password' => 'password')
        )
    )

    ));

无需发布关联的视图,因为该表单会收集信息并按预期方式将其发布。

就目前而言,无论此POST数据是什么,$ this-> Auth-> login()都将始终返回TRUE。用户是否存在以及密码是否正确并不重要。

Cake正在寻找合适的桌子和合适的用户。我已打开MySQL General Log以确保实际查询正确,因此这里没有问题。

然后,我移至实际的Cake代码并找到以下内容。我们感兴趣的代码位于下面的$ROOT/lib/Cake/Controller/Component/AuthComponent.php第595-607行(login()函数):

public function login($user = null) {
    $this->_setDefaults();

    if (empty($user)) {
        $user = $this->identify($this->request, $this->response);
    }
    if ($user) {
        $this->Session->renew();
        $this->Session->write(self::$sessionKey, $user);
    }
    CakeLog::write('debug',"LOGGEDIN:". $this->loggedIn());
    return $this->loggedIn();
}

当我们不传递任何参数时,Cake将尝试向identify用户(第599行),然后返回其loggedIn当前状态。正如我们在第820-822行中看到的那样,loggedIn它只是一个user()调用的布尔结果,所以让我们看一下user()(第648-658行)。

public static function user($key = null) {
    if (!empty(self::$_user)) {
        $user = self::$_user;
    } elseif (self::$sessionKey && CakeSession::check(self::$sessionKey)) {
        $user = CakeSession::read(self::$sessionKey);
    } else {
        CakeLog::write('debug',"return null");
        return null;
    }
    if ($key === null) {
        ob_start();
        var_dump($user);
        $d=ob_get_contents();
        ob_clean();
        CakeLog::write('debug',"return user: " . $d);
        return $user;
    }
    CakeLog::write('debug',"return hash" . Hash::get($user,$key));
    return Hash::get($user, $key);
}

由于我们user()不带任何参数调用,因此$key将为NULL,并且代码将简单地return $user-至少对我而言-这就是问题所在。如果我var_dump($user)如上所述,我得到一个空数组,但是得到“ TRUE”和登录过程“ suceeeds”(当然是错误的)。

2014-05-25 00:24:04 Debug: return user: array(1) {
  ["Cliente"]=>
  array(3) {
    ["idcliente"]=>
    NULL
    ["username"]=>
    NULL
    ["password"]=>
    NULL
 }
}

我正在使用Cake 2.4.1,但是我检查了2.4.10之前的所有2.4版本,并且代码没有更改,因此这将在整个Cake 2.4中发生。我还没有查找其他次要版本。我在OSX上运行PHP 5.5.3,但这在这里听起来与我不太相关。

我还没有阅读引发此问题的任何ChangeLogs,因此在SO中有一些未解决的问题。

我不想在不先共享的情况下更改核心代码,并且不确定SO是否是发布此代码的“适当”地方,这很可能是我只是忽略了一些东西。

如果有人可以阐明一些想法并提出一些想法,那将是不胜感激的。

谢谢!

bal

我已经设法缩小了问题的范围,尽管它似乎不是核心代码中的错误,但似乎确实可以作为进一步研究的行为。

假设您拥有一个“干净”的浏览器会话,并且没有会话cookie。在这种情况下,代码将按预期工作。错误的用户名和/或密码将被拒绝。

但是,一旦登录,Cake将为浏览器处理一个会话cookie(CAKEPHP),该cookie以及其他信息会将该会话链接到登录的用户。

如果您尝试再次登录(“在当前登录名的顶部”),那么$this->Auth->login()(不带参数)无论如何都会产生TRUE。如果您提供了错误的用户名/密码,它将坚持当前有效的密码。如果您提供有效的用户名/密码,它将更改为新用户。

除非您注销,或者会话cookie过期(或例如手动删除它),否则无论是否$this->Auth->login()使用参数调用都无关紧要

从“页面流” /逻辑的角度来看,这似乎是有道理的(为什么一个人在登录后会再次调用“登录”?),但是从用户行为的角度来看,这可能会导致(如此处所述!)怪异的问题。

假设您登录后,可以做任何想做的事情,而无需注销即可离开Web应用程序。在Cake的Session Cookie期间,您将保持登录状态。如果您与其他人共享浏览器和应用程序,则该人可能会通过登录但误输入密码来意外地使用您的帐户,在这种情况下,如上所述,login()将返回TRUE,但不会更改用户。更不用说潜在的恶意使用。

在任何情况下...最好$this->Auth->logout()在登录前强制a以避免潜在的应用行为异常。

由于该方法似乎在Cake 2.x的整个版本中都存在,所以我希望我的问题也能使其他人明白。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Cake 2.X从rawQuery检索数据

来自分类Dev

Cake PHP始终返回0 $ this-> Layout-> boolYesNo($ enquiry ['Enquiry'] ['read']

来自分类Dev

Cake PHP加入的查询作为关联数组返回

来自分类Dev

Cake PHP Where子句

来自分类Dev

Cake PHP日期验证

来自分类Dev

Cake PHP 2.x模型验证被调用两次

来自分类Dev

Cake PHP 3.0。*-dev错误?

来自分类Dev

Cake Php分页器问题

来自分类Dev

Cake PHP如何更新AROS

来自分类Dev

Cake PHP动态表检索

来自分类Dev

在Cake Php中转换的代码

来自分类Dev

php cake find() 使用 OR 条件

来自分类Dev

在Cake PHP 2.x中-如何包含存储在Components文件夹的子文件夹中的组件?

来自分类Dev

Cake 2.X 如何在每个动作刷新会话

来自分类Dev

Cake php,未显示验证消息

来自分类Dev

CAKE PHP更改日期格式

来自分类Dev

Cake PHP 3.0中的jQuery ajax调用

来自分类Dev

Cake PHP博客教程错误PostsController Mising

来自分类Dev

Cake php框架App :: import问题

来自分类Dev

Cake PHP和输入字段样式

来自分类Dev

Cake PHP:3.0-使用集合

来自分类Dev

错误:找不到 TempsController。Cake PHP

来自分类Dev

如何使用Cake脚本执行t4模板

来自分类Dev

在Apache2 / Cake PhP中定义文档根

来自分类Dev

在Windows的WAMP上运行CakePHP 2.x时,如何解决CAKE_CORE_INCLUDE_PATH的错误?

来自分类Dev

在Windows的WAMP上运行CakePHP 2.x时,如何解决CAKE_CORE_INCLUDE_PATH的错误?

来自分类Dev

Symfony2:$ form-> isValid()始终返回true

来自分类Dev

CakePHP:Cake php中的“ $ this-> fetch('css')&$ this-> Html-> css('cake.generic')之间的区别

来自分类Dev

如何模拟AppModel方法返回AuthComponent值