Как отключить хеширование пароля по запросу CakePHP3 перед его вставкой в ​​базу данных? - PullRequest
0 голосов
/ 28 января 2019

В Моем приложении я по умолчанию использую DefaultPasswordHasher для cakephp3 для создания и изменения пароля пользователя.Я делаю модуль экспорта / импорта пользователей 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.Я не хочу не загружать Auth Component для каждого метода Users.

Есть ли способ отключить хеширование по требованию для поля «пароль»?

1 Ответ

0 голосов
/ 30 января 2019

Я нашел решение самостоятельно.

Я попытался найти решение, которое было совершенно неверным, когда я разместил свой вопрос.Правильный вопрос: есть ли способ отключить хеширование пароля по требованию перед его вставкой в ​​базу данных?

Я не знаю, является ли это лучшим решением.

Поскольку хеширование выполняетсяпо модели, поэтому я создал новую модель, которая указывает на ту же таблицу, что и модель пользователя.

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;
    }
}

Создание файла сущности src /Model / Entiry / NoHashPasswordUser.php, у которого нет функции _setPassword

В 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)
...