我尝试从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>
答案 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;
}
此致 中号