node.js - документация - node js mongodb пример




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

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

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

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

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

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

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

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


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

password: { type: String, select: false }

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

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

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

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

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

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 }

Решение состоит в том, чтобы никогда не хранить пароли открытого текста. Вы должны использовать пакет, например [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

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


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





mongoose