hash пароль при создании и обновлении

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

User.beforeCreate((user, options) => {
  user.password = encryptPassword(user.password)
})

Который будет легко выполняться и хешировать пароль для новых пользователей. Но у меня проблема при обновлении пароля. Если я просто сделаю

User.beforeUpdate((user, options) => {
  user.password = encryptPassword(user.password)
})

затем каждый раз, когда пользователи обновляют свою запись (т. е. обновляют имя, адрес и т. д.), он запускает ловушку и повторно хеширует пароль.

Как я могу узнать, когда пароль изменен, чтобы я мог активировать хук? Кроме того, вместо этих двух хуков, как я могу просто использовать beforeSave для достижения того же результата?

ОБНОВЛЕНИЕ

В соответствии с запросом мое определение пользователя так же просто, как

sequelize.define(
  'user',
  {
    id: {
      type:          Sequelize.INTEGER,
      autoIncrement: true,
      primaryKey:    true,
    },
    emailAddress: {
      field:        'email_address',
      type:         Sequelize.STRING,
      allowNull:    false,
      unique:       true,
      validate: {
        isEmail: {
          args:     true,
          msg:      "Email is not valid"
        }
      },
    },
    password: {
      type:         Sequelize.STRING,
      allowNull:    false,
      validate: {
        min: {
          args:     6,
          msg:      "Password must be more than 6 characters"
        }
      }
    }
  }
)

person spondbob    schedule 25.07.2017    source источник


Ответы (1)


Эй, позвольте мне попробовать

Итак, сначала вы можете запустить одну и ту же функцию для обоих хуков, как показано ниже:

function encryptPasswordIfChanged(user, options) {
  if (user.changed('password')) {
    encryptPassword(user.get('password'));
  }
}

User.beforeCreate(encryptPasswordIfChanged);
User.beforeUpdate(encryptPasswordIfChanged);

Если вы хотите изменить пароль в своем обновлении и создать конечные точки API, вы можете просто вызвать user.set('password', somePasswordString);. Я не совсем уверен, что это именно то, что вам нужно, но я думаю, что этот шаблон должен делать то, что вам нужно. Функция .changed должна возвращать true при создании пользователя, потому что _previousDataValues для пароля должно быть undefined.

Удачи :)

person Dylan Aspden    schedule 26.07.2017
comment
Эй, это выглядит хорошо. С .changed() я могу сказать, когда пароль был изменен. Но другая проблема заключается в том, что хук не запускает проверку. Поэтому, если моя проверка говорит, что минимальный пароль составляет 6 символов, я все равно могу передать 3-значный пароль. - person spondbob; 01.08.2017
comment
Проверяли ли вы sequelize.readthedocs.io/en/v3/docs/hooks ? Это означает, что хук проверки будет запущен до этих двух хуков. Возможно, я смогу дать вам некоторое представление, если вы опубликуете свое определение Sequelize для пользовательской таблицы, над которой вы работаете. - person Dylan Aspden; 01.08.2017
comment
Я понимаю порядок хуков, и он все еще актуален для версии 4. Я использую docs.sequelizejs.com/manual/tutorial/. Но я до сих пор не понимаю, почему проверка не применяется при срабатывании хука обновления/создания. Я добавил свое определение пользователя. - person spondbob; 10.08.2017