我已经学习了CakePHP关于使用Blowfish加密哈希密码的书,这很有效,没有任何问题。
我现在已经遵循了这个指南,http://www.nikatrex.com/blog/?p=300,以便查看如何验证我的用户电子邮件帐户。这是有效的,我创建的电子邮件带有指向我的网站的路径的链接,然后在URL字符串中接收电子邮件,就会将令牌保存在我的数据库中,如果正确,它会将我的active
和verify
数据库字段设置为true!
然而,它似乎也更改了我保存的Blowfish密码,每次我测试链接时,CakePHP似乎都会在users password字段中写入一个新的Blowfishhash。
我知道Blowfish的salt是在运行时生成的,所以即使用户输入的密码相同,它也会保存不同的哈希密码。这不是我的问题,当我验证我的用户电子邮件时,它重新保存了密码,甚至知道我不是告诉它这样做。
所以这是我的用户模型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
我已经构建了一个简单的邮件到PHP代码(这是一个临时的、快速的发送电子邮件的方法,因为出于某种原因,CakePHP电子邮件对我不起作用,但我认为这取决于我的LAMP堆栈配置/gmail设置),这是向我的用户发送链接的行
$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('/');
}
}
}
我正在设置一个"活动;"verified'标记到数据库中,如果以后我想停用该用户,我可以。我还将"token"擦除为null,这样,如果用户更改了他们的电子邮件地址,我就可以设置一个新的token,我只想确保它将是一个新token!
我确信它对我的模型做了修改,但我看不出它出了什么问题,它对密码字段的isset进行了if检查,哪一个不是?除非我不了解数据的移动方式?
谢谢。
实际上,使用这些信息很难找到正在发生的事情。试试这个,希望这能暂时解决你的问题。。。。
$this->User->save($GetUserToVerify, array(
'fieldList' = array('token','active','verified')));