Маскирование полей документа [дубликат]

 $_SERVER['REMOTE_ADDR'];

попробуйте этот

51
задан Luis Elizondo 23 August 2012 в 17:31
поделиться

10 ответов

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

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

Ответ JohnnyHKs с использованием параметров схемы, вероятно, является тем, как это сделать.

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

43
ответ дан aaronheckmann 18 August 2018 в 21:27
поделиться
  • 1
    это также будет работать .populate ('user': 1, 'password': 0) – Sudhanshu Gaur 24 July 2015 в 21:08

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

0
ответ дан Anand Kapdi 18 August 2018 в 21:27
поделиться

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

А именно, как отправить пользователя обратно клиенту в пользователе .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);
    });
});
0
ответ дан Bennett Adams 18 August 2018 в 21:27
поделиться

Решение состоит в том, чтобы никогда не хранить незашифрованные пароли. Вы должны использовать пакет, например [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
2
ответ дан Cameron Hudson 18 August 2018 в 21:27
поделиться

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

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
1
ответ дан Ikbel 18 August 2018 в 21:27
поделиться
  • 1
    Я тестировал каждый ответ, я думаю, что это лучший вариант, если вы разрабатываете api. – asmmahmud 10 August 2018 в 14:17

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

password: { type: String, select: false }

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

Users.findOne({_id: id}).select('+password').exec(...);
176
ответ дан JohnnyHK 18 August 2018 в 21:27
поделиться
  • 1
    Отлично. Можете ли вы привести пример того, кто добавить его в поиске? Предполагая, что у меня есть: Users.find ({id: _id}), где я должен добавить «+ пароль +»? – Luis Elizondo 23 August 2012 в 19:13
  • 2
    Нашел пример по указанной ссылке. mongoosejs.com/docs/api.html#schematype_SchemaType-select Спасибо – Luis Elizondo 23 August 2012 в 19:19
  • 3
    Есть ли способ применить это к объекту, переданному для save () обратного вызова? Таким образом, когда я сохраняю профиль пользователя, пароль не включается в параметр обратного вызова. – Matt 29 June 2014 в 05:15
  • 4
    По-моему, это лучший ответ. Добавьте это один раз, и оно исключено. Намного лучше, чем добавлять опцию select или exclude для каждого запроса. – AndyH 18 August 2016 в 08:29
  • 5
    Это должен быть принятый ответ! – Ivanstame 3 November 2016 в 16:45

Edit:

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

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

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")

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

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

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

password: { type: String, select: false }
12
ответ дан Luis Elizondo 18 August 2018 в 21:27
поделиться
  • 1
    Я бы выбрал последний вариант. Никогда не выбирайте пароль, за исключением функций logIn / passwordUpdate, в которых вы действительно нуждаетесь. – rdrey 24 August 2012 в 14:54
  • 2
    По какой-то причине этот вариант не работал с локальной стратегией Passport.js, не знаю почему. – Luis Elizondo 24 August 2012 в 18:49
  • 3
    Хороший ответ, спасибо !!! Не знаю, почему, но когда я делаю .select("+field"), он приносит только __id, хотя .select("-field") отлично выделяет поле, которое я хочу – Renato Gama 13 February 2013 в 04:19
  • 4
    Извините, он отлично работает, не заметил, что select: false является обязательным – Renato Gama 13 February 2013 в 04:24

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

.exclude('password')

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

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

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

3
ответ дан onkar 18 August 2018 в 21:27
поделиться
  • 1
    Отлично. Благодарю. Мне нравится этот подход. – Luis Elizondo 23 August 2012 в 19:18

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

0
ответ дан Ricky 18 August 2018 в 21:27
поделиться

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

3
ответ дан Ylli Gashi 18 August 2018 в 21:27
поделиться
  • 1
    Не можете ли вы переопределить поведение в конечной точке входа? Если это так, это выглядит как самый безопасный вариант. – erfling 6 June 2018 в 16:45
Другие вопросы по тегам:

Похожие вопросы: