Как защитить поле пароля в Mongoose / MongoDB, чтобы он не возвращался в запрос при заполнении коллекций?

Предположим, у меня есть две коллекции / схемы. Одна из них – это схема пользователей с полями имени пользователя и пароля, затем у меня есть схема блогов, в которой есть ссылка на схему пользователей в поле автора. Если я использую Mongoose, чтобы сделать что-то вроде

Blogs.findOne({...}).populate("user").exec() 

У меня также будет документ Blog и пользователь, но как я могу запретить Mongoose / MongoDB возвращать поле пароля? Поле пароля хешировано, но оно не должно быть возвращено.

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

Кроме того, в некоторых ситуациях мне нужно получить поле пароля, например, когда пользователь хочет войти в систему или изменить пароль.

 .populate('user' , '-password') 

http://mongoosejs.com/docs/populate.html

Ответ JohnnyHKs, использующий опции Schema, – это, вероятно, путь сюда.

Также обратите внимание, что query.exclude() существует только в ветке 2.x.

Вы можете изменить поведение по умолчанию на уровне определения схемы с помощью атрибута select в поле:

 password: { type: String, select: false } 

Затем вы можете потянуть его по мере необходимости в find и populate вызовов с помощью выбора поля в качестве '+password' . Например:

 Users.findOne({_id: id}).select('+password').exec(...); 

Редактировать:

Пробовав оба подхода, я обнаружил, что исключающий всегда подход не работал для меня по какой-то причине с использованием паспортно-местной страtagsи, не знаю почему.

Итак, вот что я в итоге использовал:

 Blogs.findOne({_id: id}) .populate("user", "-password -someOtherField -AnotherField") .populate("comments.items.user") .exec(function(error, result) { if(error) handleError(error); callback(error, result); }); 

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


После нескольких отличных ответов я узнал, что есть два способа сделать это: «всегда включать и исключать иногда» и «всегда исключать и включать иногда»?

Пример:

Включить всегда, но иногда исключать пример:

 Users.find().select("-password") 

или

 Users.find().exclude("password") 

Exlucde всегда, но иногда включает пример:

 Users.find().select("+password") 

но вы должны определить в схеме:

 password: { type: String, select: false } 

User.find().select('-password') – правильный ответ. Вы не можете добавить select: false на Схеме, поскольку он не будет работать, если вы хотите войти в систему.

Предполагая, что ваше поле пароля является «паролем», вы можете просто сделать:

 .exclude('password') 

Здесь представлен более обширный пример

Это сосредоточено на комментариях, но это тот же самый принцип в игре.

Это то же самое, что использовать проекцию в запросе в MongoDB и передачу {"password" : 0} в поле проекции. См. Здесь

Вы можете добиться этого, используя схему, например:

 const UserSchema = new Schema({/* */}) UserSchema.set('toJSON', { transform: function(doc, ret, opt) { delete ret['password'] return ret } }) const User = mongoose.model('User', UserSchema) User.findOne() // This should return an object excluding the password field 

Решение состоит в том, чтобы никогда не хранить пароли открытого текста. Вы должны использовать пакет, например [bcrypt] 1 или [password-hash] 2 .

Пример использования для хеширования пароля:

  var passwordHash = require('password-hash'); var hashedPassword = passwordHash.generate('password123'); console.log(hashedPassword); // sha1$3I7HRwy7$cbfdac6008f9cab4083784cbd1874f76618d2a97 

Пример использования пароля для проверки:

 var passwordHash = require('./lib/password-hash'); var hashedPassword = 'sha1$3I7HRwy7$cbfdac6008f9cab4083784cbd1874f76618d2a97'; console.log(passwordHash.verify('password123', hashedPassword)); // true console.log(passwordHash.verify('Password0', hashedPassword)); // false 

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

А именно, как отправить пользователя обратно клиенту в обратном вызове user.save () без поля пароля.

Случай использования: пользователь приложения обновляет информацию / настройки своего профиля от клиента (пароль, контактную информацию, whatevs). Вы хотите отправить обновленную информацию о пользователе обратно клиенту в ответ, как только он успешно будет сохранен в mongoDB.

 User.findById(userId, function (err, user) { // err handling user.propToUpdate = updateValue; user.save(function(err) { // err handling /** * convert the user document to a JavaScript object with the * mongoose Document's toObject() method, * then create a new object without the password property... * easiest way is lodash's _.omit function if you're using lodash */ var sanitizedUser = _.omit(user.toObject(), 'password'); return res.status(201).send(sanitizedUser); }); }); 

Blogs.findOne({ _id: id }, { "password": 0 }).populate("user").exec()

При использовании password: { type: String, select: false } вы должны иметь в виду, что он также будет исключать пароль, когда он нам понадобится для аутентификации. Поэтому будьте готовы обращаться с ним, как хотите.

  • Как установить зависимости одноранговых связей npm автоматически?
  • Как я могу получить Express для вывода хорошо отформатированного HTML?
  • Использовать переменную в Jade include
  • Node.js - Как удалить порт из URL-адреса?
  • Что конкретно представляет собой цикл событий Node.js?
  • socket.io комнаты или namespacing?
  • Android-шлюз, подписанный якорем HTTPS, для пути сертификации не найден
  • Как импортировать глобальные модули в узел? Я получаю «Ошибка: не могу найти модуль »?
  • Зачем использовать AJAX, когда доступны WebSockets?
  • Как использовать данные JSON POST в приложении Express
  • Mongoose findByIdAndUpdate не возвращает правильную модель
  • Давайте будем гением компьютера.