Sequelize: не возвращать пароль

Я использую Sequelize для поиска БД для записи пользователя, и я хочу, чтобы поведение модели по умолчанию не вернуть password поле для этой записи. The password поле является хэшем, но я все равно не хочу его возвращать.

у меня есть несколько вариантов, которые будут работать, но ни один не кажется особенно хорошим:

  1. создать пользовательский метод класс findWithoutPassword на User модель и в рамках этого метода сделайте User.find С attributes установить как показано в Sequelize docs

  2. сделать нормальный User.find и фильтровать результаты в контроллере (не рекомендуется)

  3. используйте другую библиотеку, чтобы удалить ненужные атрибуты

есть ли лучший способ? Лучше всего было бы, если есть способ указать в определении модели Sequelize никогда не возвращать password поле, но я не нашел способа сделать это.

5 ответов


Я бы предложил переопределить toJSON функция:

sequelize.define('user', attributes, {
  instanceMethods: {
    toJSON: function () {
      var values = Object.assign({}, this.get());

      delete values.password;
      return values;
    }
  }
});

или в sequelize v4

const User = sequelize.define('user', attributes, {});

User.prototype.toJSON =  function () {
  var values = Object.assign({}, this.get());

  delete values.password;
  return values;
}

toJSON вызывается, когда данные возвращаются пользователю, поэтому конечные пользователи не будут видеть поле пароля, но оно все равно будет доступно в вашем коде.

Object.assign клонирует возвращаемый объект-в противном случае вы полностью удалите свойство из экземпляра.


может быть, вы можете просто добавить exclude в атрибут, когда вы find, выглядит так:

var User = sequelize.define('user', attributes);

User.findAll({
    attributes: {
        exclude: ['password']
    }
});

читать docs для более подробной информации


другой способ-добавить область по умолчанию в пользовательскую модель.

добавьте это в объект options модели

defaultScope: {
  attributes: { exclude: ['password'] },
}

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

добавьте это в объект options модели

scopes: {
  withoutPassword: {
    attributes: { exclude: ['password'] },
  }
}

затем вы можете использовать его в запросах

User.scope('withoutPassword').findAll();

мне нравится использовать комбинацию обоих ответов Павана и объявить следующее:

defaultScope: {
    attributes: { exclude: ['password'] },
},
scopes: {
    withPassword: {
        attributes: { },
    }
}

Это позволяет мне исключить пароль по умолчанию и использовать withPassword область для явного возврата пароля при необходимости, например, при запуске метода входа в систему.

userModel.scope('withPassword').findAll()

это гарантирует, что пароль не возвращается при включении пользователя через ссылочное поле, например

accountModel.findAll({
    include: [{
        model: userModel,
        as: 'user'
    }]
})

есть плагин для атрибуты области обзора как обсуждалось здесь.

Я пошел с переопределением, как указано в принятом ответе, за исключением того, что я назвал оригинал toJSON, а не get С this.constructor.super_.prototype.toJSON.apply(this, arguments) как описано в api docs