我在CakePHP 2.4中遇到了一些问题。我烘焙了一个简单的应用程序来创建登录。我做了书中的所有内容(Auth和Tutorial)。但只有sha1工作。但不是sha256或md5。在搜索和测试之后,我找到了一个解决方案,我不得不更改书中的示例代码,现在它可以工作了。但我认为,这不是正确的解决方案。
我在AppController中执行了以下操作:
App::uses('Controller', 'Controller');
class AppController extends Controller {
public $components = array(
'Session',
'Auth' => array(
'authenticate' => array(
'Form' => array(
'passwordHasher' => array(
'className' => 'Simple',
'hashType' => 'sha256'
)
)
)
)
);
}
我用md5,sha1和sha256测试了这个。没问题。如果密码被适当地散列,则登录有效。
但我注意到,添加用户仅适用于sha1 ,因为这是默认哈希。 我的用户模型之前的安全功能就是这个(来自书中):
App::uses('SimplePasswordHasher', 'Controller/Component/Auth');
class User extends AppModel {
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;
}
}
我想,AppController中的设置就足够了,也可以改变这个区域的SimplePasswordHasher。但看起来,这还不够。所以我改成了这个:
$this->data[$this->alias]['password'] = $passwordHasher->hash(
$this->data[$this->alias]['password']
);
到这个
$this->data[$this->alias]['password'] = Security::hash(
$this->data[$this->alias]['password'],
'sha256',
true
);
现在一切都像魅力一样。但我的问题是:
1)我是对的,这是必要的还是我的代码还有其他问题?
2)据我所知,$xxx->zzz
仅适用于控制器而xxx::zzz()
适用于所有地方,对吧?
3)为什么我必须说安全散列,它应该再次使用sha256散列字符串,当我说已经在AppController中一般?
答案 0 :(得分:0)
1。据我所知,您的方法是正确的。可能存在一种更清洁的方式,但我使用bcrypt
,并且Cookbook说要做一些非常相似的事情。
2。你可以像你说的那样思考一个简单的解释。基本上->
是object-operator
,用于处理对象,例如$this->doEverything
。 ::
是scope-resolution-operator
,用于查找Class静态属性或方法。通常你可以在任何地方运行它,例如Security::hash()
。
3。看一下here,您应该将AppController
更改为:
'passwordHasher' => array(
'className' => 'Simple',
'hashType' => 'sha256'
)
以适应推荐。我试过这个,并没有将SimplePasswordHasher
更改为SHA256。蛋糕似乎在某种程度上忽略了它的参考。但这就是简单的哈希,旨在简单的事情,所以你 应该做自己的方法,或者更适合你的需要。