【问题标题】:CakePHP: Clearing password field on failed submissionCakePHP:提交失败时清除密码字段
【发布时间】:2010-11-22 01:38:05
【问题描述】:

您好,

我正在设置一个带有密码字段的非常标准的注册表单。

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

查看:

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

控制器:

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

非常感谢帮助,谢谢!

【问题讨论】:

    标签: php cakephp passwords authentication


    【解决方案1】:

    这个?

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

    【讨论】:

    • 谢谢,这个也可以。这是实现我想要的标准方式吗?
    • 这就是为表单助手设置输入字段值的方式
    【解决方案2】:

    在您的控制器中:

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

    【讨论】:

    • hmmm,这对我来说似乎有点 hacky,因为我有几种类型的用户在数据库中具有不同的属性,并且将来可能会添加更多。但现在我想它可以工作了,谢谢:)
    【解决方案3】:

    您可能会在使用 cakePHP 密码验证的过程中遇到另一个问题。

    问题是cake首先对密码进行哈希处理,然后进行验证,即使根据您的规则有效,也可能导致输入失败。这就是为什么密码返回到输入字段的原因是散列而不是正常的。


    要解决此问题,不要使用特殊字段名称“密码”,而是使用不同的名称,例如“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');
    

    在您的 Vendor 模型中,不要将验证规则分配给“密码”,而是将这些规则分配给“tmp_pass”,例如

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

    变成

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

    最后,在您的 Vendor 模型中,实现 beforeSave()。

    首先,查看数据是否有效('tmp_pass' 将根据您的规则进行验证)。

    如果成功,手动哈希 tmp_pass 并将其放入 $this->data['Vendor']['password'] 然后返回 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 - 这对我也很有帮助,但是我建议使用正确的 Auth->password()Auth->hashPasswords() 函数,而不是自己加盐和散列。
    • 您应该自己使用sha1 散列密码,因为这可能会引入与Auth 方式不一致的情况(如果您是这样're using) 对密码进行哈希处理。请改用$this->Auth->password()
    • @deceze,查看源代码,Auth::hashPasswords() 将调用 User::hashPassword() 函数(如果已定义),而 Auth::password() 不会。
    • @nickf 很有趣。该手册确实建议Auth::password() 比较散列密码和明文密码。这个问题应该值得调查。不过,任何一个都比sha1 好。 :)
    猜你喜欢
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 2015-12-19
    • 2014-10-17
    相关资源
    最近更新 更多