我已经使用Blowfish加密关于散列密码的CakePHP书籍,这没有任何问题。
我现在已按照本指南http://www.nikatrex.com/blog/?p=300进行操作,以了解如何验证我的用户电子邮件帐户。这是有效的,我构建的电子邮件带有指向我网站路径的链接,然后在URL字符串中获取电子邮件,获取保存在我的数据库中的令牌,如果正确,则设置我的active
和verify
数据库字段为真!
但是,它似乎也改变了我保存的Blowfish密码,每次测试链接时,CakePHP似乎都会在用户密码字段中写入一个新的Blowfish哈希值。
我知道Blowfish的盐是在运行时生成的,因此即使用户输入的密码相同,它也会保存不同的哈希密码。这不是我的问题,当我验证用户的电子邮件时,它重新保存了密码,即使知道我不告诉它。
所以这是我的用户模型Blowfish的密码,
public function beforeSave($options = array()) {
if (isset($this->data[$this->alias]['password'])) {
$this->data[$this->alias]['password'] = Security::hash($this->data[$this->alias]['password'],'blowfish');
}
return true;
} //End of BeforeSave
我已经构建了(这是一个临时的,快速的方法,现在发送电子邮件,因为由于某种原因CakePHP电子邮件不适合我,但我认为这是我的LAMP堆栈配置/ gmail设置)一个简单的邮件对于PHP代码,这是将链接发送给我的用户的行
$message .= '<a href="verifymyuser/t:'.$hash.'/n:'.$this->data['User']['email'].'">CLICK HERE</a>';
这是我在用户点击链接时加载的功能
public function VerifyMe() {
if (!empty($this->passedArgs['n']) && !empty($this->passedArgs['t'])){
$SentEmail = $this->passedArgs['n'];
$SentToken = $this->passedArgs['t'];
$GetUserToVerify = $this->User->findByEmail($SentEmail);
if ($GetUserToVerify['User']['active'] == 0){
if($GetUserToVerify['User']['token'] == $SentToken) {
$GetUserToVerify['User']['active'] = true;
$GetUserToVerify['User']['token'] = NULL;
$GetUserToVerify['User']['verified'] = true;
$this->User->save($GetUserToVerify);
$this->Session->setFlash('Thank You, your email has been verified successfully, enjoy', 'GoodFlashMsg', array(), 'Good');
$this->redirect('/login');
exit();
}
} else {
$this->Session->setFlash('You are already verified', 'BadFlashMsg', array(), 'Bad');
$this->redirect('/');
}
}
}
我正在设置一个活跃的; &#39;验证&#39;标记到数据库中,如果以后我想要取消激活用户我可以。我也在擦&&#39;令牌&#39;如果用户更改了他们的电子邮件地址,那么我可以设置一个新令牌,我只想确保它是一个新令牌!
我确信它已经完成了我的模型,但我看不出它有什么问题,它有一个if检查密码字段的isset,它不是吗?除非我不了解数据的移动方式?
感谢。
答案 0 :(得分:1)
实际上,这些信息很难找到正在发生的事情。 试试这个,希望这会暂时解决你的问题......
$this->User->save($GetUserToVerify, array(
'fieldList' = array('token','active','verified')));