在“我的应用”中,默认情况下,我使用cakephp3的DefaultPasswordHasher创建和修改用户密码。 我正在做一个CSV导出/导入用户模块,该模块允许通过DefaultPasswordHasher导入已散列的密码。
我的CSV中有一些用户具有纯文本密码,这些密码将在导入过程中进行哈希处理。而且用户已经具有哈希密码,因此只需将其推送到数据库即可。
username;displayname;password_type;password;profilename;enabled;admin
user1;User1;plaintext;abcd1234;Default;1;1
user2;User2;hashed;$ueipzueirzouiodjfm$dsklfj;Default;1;1
所以我尝试了这个:
创建文件./src/Auth/LegacyPasswordHasher.php并将其插入:
<?php
namespace App\Auth;
use Cake\Auth\AbstractPasswordHasher;
class LegacyPasswordHasher extends AbstractPasswordHasher
{
public function hash($password)
{
return $password;
}
}
?>
在UsersController.php中
public function import()
{
...
// If hashed is set in CSV line then :
$this->loadComponent('Auth', [
'authenticate' => [
'Form' => [
'passwordHasher' => ['className' => 'Legacy',]
]
]
]);
...
}
我收到一个错误消息,即“ Auth”别名已被加载。是的,它是由父AppController.php实现的。我要避免在每个Users方法上加载Auth Component。
有没有一种方法可以仅根据需要禁用字段“密码”的哈希处理?
答案 0 :(得分:0)
我自己找到了解决方法。
发布问题后,我尝试的解决方案完全错误。 正确的问题是:在将密码插入数据库之前,是否有办法按需禁用哈希密码?
我不知道这是否是最佳解决方案。
由于哈希是由模型完成的,所以我创建了一个新模型,该模型指向与用户模型相同的表。
src / Model / Table / NoHashPasswordUsersTable.php:
class NoHashPasswordUsersTable extends Table
{
public function initialize(array $config) {
// Set table to use
$this->table('users');
// or After Cakephp 3.4.0
//$this->setTable('users');
...
}
public function validationDefault(Validator $validator)
{
...
// Validation rules to check length of hashed string
$validator
->add('password', 'notEmpty', [
'rule' => ['lengthBetween', 60, 60],
'message' => __('Hashed password should contains 60 chars')
]);
return $validator;
}
}
创建一个没有功能_setPassword的实体文件src / Model / Entiry / NoHashPasswordUser.php
在src / Controller / UsersController.php中:
// Load model that allow to import Users without hashing the password
$this->loadModel('NoHashPasswordUsers');
...
// I can switch Model to use to hash or not hash the password, for example
$this->Users->save($user)
$this->NoHashPasswordUsers->save($user)