2009-08-23 59 views
6

问候,CakePHP:在提交失败时清除密码字段

我正在设置一个包含密码字段的相当标准的注册表单。

的问题是,一个失败的提交后(由于空字段,不正确的格式等),控制器重新加载注册页面,但用含有先前输入的密码的散列值的密码字段。如何在每次提交失败后将其清空?

查看:

echo $form->password('Vendor.password', array('class' => 'text-input')); 

控制器:

Security::setHash('sha1'); 
$this->Auth->sessionKey = 'Member'; 
$this->Auth->fields = array(
    'username' => 'email', 
    'password' => 'password' 
); 

帮助非常感谢,谢谢!

回答

9

您可能会遇到另一个问题来与CakePHP的密码验证的道路。

问题是,蛋糕哈希密码第一,然后做验证,这可能会导致输入失败,即使它是有效的根据您的规则。这就是密码返回到输入字段散列而不是普通的原因。


要解决此问题,而不是使用专用字段名称'password',请使用不同的名称,如'tmp_pass'。这样,cakePHP Auth不会自动对该字段进行散列。

下面是一个示例形式

echo $form->create('Vendor', array('action' => 'register')); 
echo $form->input('email'); 
echo $form->input('tmp_pass', array('label' => 'Password','type'=>'password')); 
echo $form->end('Register'); 

在你的供应商的模式,不分配验证规则“密码”,而不是分配这些规则“tmp_pass”,例如

var $validate = array('email' => 'email', 'password' => ... password rules...); 

变成

var $validate = array('email' => 'email', 'tmp_pass' => ... password rules...); 

最后,在你的供应商模式,实现beforeSave()。

首先,看看数据,用于验证(“tmp_pass”将会对你的规则进行验证)。

如果成功的话,手动哈希tmp_pass并把它放在$这个 - >数据[“供应商”] [“密码”],然后返回true。如果不成功,则返回false。

function beforeSave() { 
    if($this->validates()){ 
     $this->data['Vendor']['password'] = sha1(Configure::read('Security.salt') . $this->data['User']['tmp_pass']); 
     return true; 
    } 
    else 
     return false; 
} 
+1

+1 - 这对我也很有帮助,但是我建议使用正确的'Auth-> password()'或'Auth-> hashPasswords()'函数比腌制和哈希自己。 – nickf 2009-11-11 05:47:28

+0

你应该**不要**用'sha1'自己填写密码,因为这可能会引入与'Auth'(如果这就是你使用的)方式不一致的方式将密码散列在路上。改用'$ this-> Auth-> password()'! – deceze 2009-11-11 05:48:05

+1

@deceze,查看源代码,如果定义了'Auth :: hashPasswords()',将会调用'User :: hashPassword()'函数,而'Auth :: password()'不会。 – nickf 2009-11-11 06:08:17

8

这个?

password('Vendor.password', array('class' => 'text-input','value'=>'')) 
+0

谢谢的,这一个工程了。这是达到我想要的标准方式吗? – 2009-08-23 18:12:06

+0

这就是你的表单辅助 – 2009-08-24 13:49:21

3

在你的控制器:

function beforeRender() { 
    parent::beforeRender(); 
    $this->data['Vendor']['password'] = ''; 
} 
+0

嗯设置输入字段的值,这似乎有点哈克给我,因为我有几种类型的与数据库不同的特性和用户可在未来增加更多。但现在它的工作我想,谢谢:) – 2009-08-23 18:08:41