如何在插入数据库之前按需禁用cakephp3哈希密码?

时间:2019-01-28 09:42:58

标签: php authentication cakephp-3.0

在“我的应用”中,默认情况下,我使用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。

有没有一种方法可以仅根据需要禁用字段“密码”的哈希处理?

1 个答案:

答案 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)