密码哈希两次?

时间:2013-11-30 16:45:11

标签: php cakephp hash

我尝试从CakePHP网站上学习Simple Acl受控应用程序,我遇到了哈希密码的问题。

我的表是:

CREATE TABLE users (
id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL UNIQUE,
pwd CHAR(40) NOT NULL,
group_id INT(11) NOT NULL

);

CREATE TABLE groups (
id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL

);

在模型User.php中我有:

public function beforeSave($options = array()) {
  $this->data['User']['pwd'] = AuthComponent::password($this->data['User']['pwd']);
  return true;
}

如果我点击编辑用户上的网站然后提交,则再次对pwd进行哈希处理。我该如何解决这个问题?

我试试这个论坛:

public function beforeSave($options = array()) {
  if(!empty($this->data['User']['pwd'])) {
    $this->data['User']['pwd'] = AuthComponent::password($this->data['User']['pwd']);
  } else {
      unset($this->data['User']['pwd']);
    }
  return true;

}

但它没有用。

我的edit.ctp:

<div class="users form">
<?php echo $this->Form->create('User'); ?>
<fieldset>
    <legend><?php echo __('Edit User'); ?></legend>
<?php
    echo $this->Form->input('id');
    echo $this->Form->input('username');
    echo $this->Form->input('pwd');
    echo $this->Form->input('group_id');
?>
</fieldset>
<?php echo $this->Form->end(__('Submit')); ?>
</div>
<div class="actions">
<h3><?php echo __('Actions'); ?></h3>
<ul>

    <li><?php echo $this->Form->postLink(__('Delete'), array('action' => 'delete', $this->Form->value('User.id')), null, __('Are you sure you want to delete # %s?', $this->Form->value('User.id'))); ?></li>
    <li><?php echo $this->Html->link(__('List Users'), array('action' => 'index')); ?></li>
    <li><?php echo $this->Html->link(__('List Groups'), array('controller' => 'groups', 'action' => 'index')); ?> </li>
    <li><?php echo $this->Html->link(__('New Group'), array('controller' => 'groups', 'action' => 'add')); ?> </li>
</ul>

并添加.ctp:

<div class="users form">
<?php echo $this->Form->create('User'); ?>
<fieldset>
    <legend><?php echo __('Add User'); ?></legend>
<?php
    echo $this->Form->input('username');
    echo $this->Form->input('pwd');
    echo $this->Form->input('group_id');
?>
</fieldset>
<?php echo $this->Form->end(__('Submit')); ?>
</div>
<div class="actions">
<h3><?php echo __('Actions'); ?></h3>
<ul>

    <li><?php echo $this->Html->link(__('List Users'), array('action' => 'index')); ?></li>
    <li><?php echo $this->Html->link(__('List Groups'), array('controller' => 'groups', 'action' => 'index')); ?> </li>
    <li><?php echo $this->Html->link(__('New Group'), array('controller' => 'groups', 'action' => 'add')); ?> </li>
</ul>

3 个答案:

答案 0 :(得分:0)

保存前删除AuthComponent密码。您可以在保存用户时使用它。

如果你把它放在beforeSave方法中,它会在你每次添加,编辑,更新和删除时触发。

答案 1 :(得分:0)

谢谢你的帮助。终于解决了这个问题:

https://groups.google.com/forum/#!msg/cake-php/sJLi4lCqgog/2X9VpzqWs-0J

答案 2 :(得分:0)

比较哈希:

您可以将数据库中保存的哈希值与密码字段中的文本进行比较。如果您没有触摸密码(更改了密码字段),则哈希应该匹配。假设您保存的哈希是xyz,并且密码哈希中加载的哈希仍未改动,xyz;在这种情况下,你不必重新做任何事情,哈希应该保持不变。

在另一种情况下,我们假设您保存的哈希为xyz,但您将密码html字段编辑为abc;在这种情况下,您必须重新扫描新密码(abc),然后替换数据库记录中的旧密码。

所有这些都可以在代码中翻译如下:

public function beforeSave($options = array()) {

    if (isset($this->data[$this->alias]['password'])) {

        if(isset($this->data[$this->alias]['id'])) {
            $id = $this->data[$this->alias]['id'];
            $user = $this->findById($id);
        } else {
            $id = false;
        }

        if(!$id || $this->data[$this->alias]['password'] != $user['User']['password']) {
            $passwordHasher = new SimplePasswordHasher();
            $this->data[$this->alias]['password'] = $passwordHasher->hash(
                $this->data[$this->alias]['password']
            );
        }

    }

    return true;
}

此致 中号