- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
很抱歉问了一个很长的问题,但我在 auth->login() 方面遇到了问题,经过长时间的调试,我想分享我的发现。这对我来说很可能是愚蠢的事情,但请耐心等待......
模型“Cliente”(相关部分):
<?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 扩展了 Controller {
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')
)
)
));
无需发布关联的 View ,因为表单会收集信息并按预期发布。
就目前情况而言,$this->Auth->login() 将始终返回 TRUE,无论 POSTed 数据如何。用户是否存在以及密码是否正确并不重要。
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
当前状态。 loggedIn
只是 user()
的 bool 结果正如我们在第 820-822 行中看到的那样,让我们看一下 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”并且登录过程“成功”(当然是错误的)。
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,但这听起来与我不太相关。
我还没有阅读任何提出此问题的变更日志,并且 SO 中有一些关于此问题的未解答问题。
我不想在不先共享的情况下更改核心代码,并且不确定 SO 是否是发布此内容的“正确”位置,很可能是我只是忽略了某些内容。
如果有人能够阐明一些观点并提出一些想法,我们将不胜感激。
谢谢!
最佳答案
我已经成功缩小了问题范围,虽然它似乎不是核心代码中的错误,但它似乎确实符合需要进一步调查的行为。
假设您有一个“干净”的浏览器 session ,没有 session COOKIES。在这种情况下,代码将按预期工作。错误的用户和/或密码将被拒绝。
但是,一旦您登录,Cake 将在浏览器中处理一个 session cookie (CAKEPHP),除其他信息外,该 cookie 还会将该 session 链接到已登录的用户。
如果您尝试再次登录(“在当前登录之上”),$this->Auth->login()
(不带参数)无论如何都会产生 TRUE。如果您提供了错误的用户/密码,它将坚持当前有效的用户/密码。如果您提供有效的用户/密码,它将更改为新用户。
除非您注销,或者 session cookie 过期(或者您手动删除它,例如),否则您是否使用以下命令调用 $this->Auth->login()
并不重要或不带参数。
虽然从“页面流”/逻辑角度来看,这似乎是有道理的(为什么在登录后会再次调用“登录”?),但从用户行为的角度来看,这可能会导致(如此处所注意到的!)奇怪的问题。
假设您登录,执行您想做的任何操作,然后离开您的网络应用程序而不注销。在 Cake 的 session Cookie 期间,您将保持登录状态。如果您与其他人共享浏览器和应用程序,此人可能会意外地通过登录但输入错误的密码来操作您的帐户,在这种情况下,如上所述,login()
将返回 TRUE ,但不会更改用户。更不用说潜在的恶意使用。
无论如何...在登录之前强制执行 $this->Auth->logout()
以避免潜在的应用不当行为可能是一个好习惯。
由于这种方法似乎贯穿 Cake 2.x,我希望我的问题也能澄清其他人。
关于cakephp - Cakephp 2.4.x。 Auth 组件 login() 始终返回 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23857977/
这个问题在这里已经有了答案: Why in Python does "0, 0 == (0, 0)" equal "(0, False)"? (7 个回答) 去年关闭。 代码片段 1: a = Tru
Integer i = 127; Integer j = 127; System.out.println(i == j); System.out.println(i.equals(j)); Integ
我试图用 Python 进行类似下面的代码的比较,但对产生的输出感到困惑。 谁能解释为什么输出是这样的? >>> True, True == True, True (True, True, True)
我们的下拉值是动态的 010100。 你能帮我将这些值转换为 true、false 吗? Offer的值是10100,Reject的值是10111。所以这些需要转换成 10100 = true,fal
我正在测试,如果用户在页面顶部显示一种货币“EUR”和另一种货币“GBP”,那么我期望包含文本“EUR”和页面下方还存在另一个包含文本“GBP”的链接。它包含在一个名为 "nav-tabs au-ta
如何检查数组的所有元素是真值还是假值。 因为以下内容似乎没有做到这一点:_.all([true, true, true], true); 它返回:false? 最佳答案 您应该重新阅读_.every(
C#:我有一个如下所示的字符串变量: string a = "(true and true) or (true or false)"; 这可以是任何东西,它可以变得更复杂,比如: string b
ruby : true == true == true syntax error, unexpected tEQ 对比JavaScript: true == true == true // => tr
这个问题已经有答案了: Equality of truthy and falsy values (JavaScript) (3 个回答) Which equals operator (== vs ==
为什么 R 中的 TRUE == "TRUE" 是 TRUE? R 中是否有与 === 等效的内容? 更新: 这些都返回FALSE: TRUE == "True" TRUE == "true" TRU
简单的查询,可能不可能,但我知道那里有一些聪明的人:) 给定一个 bool 参数,我希望定义我的 where 子句来限制特定列的输出 - 或不执行任何操作。 因此,给定参数@bit = 1,结果将是:
编写 Excel 公式时,将值设置为 true、“true”还是 true() 是否有区别? 换句话来说,以下哪一个是最好的?还是要看具体情况? if (A1 = 1, true, false) if
如果我们评估这个:TRUE AND TRUE,为什么会这样? 'yes' : 'no' 等于 TRUE 但不等于 yes 何时评估:(TRUE AND TRUE) ? 'yes' : 'no' 等于
这个问题在这里已经有了答案: Behaviour of and operator in javascript [duplicate] (1 个回答) 关闭 7 年前。 如题所说,我不太明白为什么(t
我有一个包含 FromDate 、 ToDate 、 VendorName 和 GoodsName 的表单,一旦一切为真,我需要显示结果 示例: FromDate="11/20/2019"、ToDat
我最近参加了 Java 的入门测试,这个问题让我很困惑。完整的问题是: boolean b1 = true; boolean b2 = false; if (b2 != b1 != b2) S
我有一个模型,我有: ipv4_address = models.IPAddressField(verbose_name=_('ipv4 address'), blank=True, null=Tru
False in [True,True] False in pd.Series([True,True]) 第一行代码返回False第二行代码返回 True! 我想我一定是做错了什么或者遗漏了什么。当我
我可以在 Coq 中证明以下内容吗? Lemma bool_uip (H1 : true = true): H1 = eq_refl true. 即true = true 的所有证明都相同吗? 例如
如果我的理解是正确的,他们做的事情完全一样。为什么有人会使用“for”变体?仅仅是味道吗? 编辑:我想我也在考虑 for (;;)。 最佳答案 for (;;) 通常用于防止编译器警告: while(
我是一名优秀的程序员,十分优秀!