Sequelize: не возвращать пароль
Я использую Sequelize для поиска БД для записи пользователя, и я хочу, чтобы поведение модели по умолчанию не вернуть password
поле для этой записи. The password
поле является хэшем, но я все равно не хочу его возвращать.
у меня есть несколько вариантов, которые будут работать, но ни один не кажется особенно хорошим:
создать пользовательский метод класс
findWithoutPassword
наUser
модель и в рамках этого метода сделайтеUser.find
Сattributes
установить как показано в Sequelize docsсделать нормальный
User.find
и фильтровать результаты в контроллере (не рекомендуется)используйте другую библиотеку, чтобы удалить ненужные атрибуты
есть ли лучший способ? Лучше всего было бы, если есть способ указать в определении модели 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