복붙노트

[MONGODB] 내가 컬렉션을 채울 때 쿼리에서 반환하지 않도록하는 방법 몽구스 / MongoDB를에서 암호 필드를 보호하기 위해?

MONGODB

내가 컬렉션을 채울 때 쿼리에서 반환하지 않도록하는 방법 몽구스 / MongoDB를에서 암호 필드를 보호하기 위해?

내가 / 스키마를 두 개의 컬렉션이 있다고 가정. 하나는, 내가 저자 필드에 사용자 스키마에 대한 참조가있는 블로그 스키마를 가지고, 사용자 이름 및 암호 필드와 사용자 스키마입니다. 내가 좋아하는 뭔가를 할 몽구스를 사용하는 경우

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

나는 블로그 문서와도 채워 사용자를 가지고 있지만, 어떻게 암호 필드를 반환에서 몽구스 / MongoDB를 방지 할 것인가? 암호 필드는 해시되어 있지만 반환 할 수 없습니다.

나는 암호 필드를 생략하고 간단한 쿼리의 필드의 나머지를 반환 할 수 있습니다 알고 있지만, 어떻게 채울으로 그렇게 않습니다. 또한,이 작업을 수행하는 어떤 우아한 방법은 무엇입니까?

또한, 어떤 상황에서 나는 사용자가 로그인을 원할 때처럼, 암호 필드를 얻거나 암호를 변경할 필요가 없습니다.

해결법

  1. ==============================

    1.

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

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

    스키마 옵션을 사용하여 JohnnyHKs의 대답은 아마 여기에 갈 수있는 방법입니다.

    또한 () 만 2.x는 지점에 존재하는 query.exclude을 확인합니다.

  2. ==============================

    2.당신은 필드의 선택 속성을 사용하여 스키마 정의 수준에서 기본 동작을 변경할 수 있습니다 :

    당신은 필드의 선택 속성을 사용하여 스키마 정의 수준에서 기본 동작을 변경할 수 있습니다 :

    password: { type: String, select: false }
    

    그럼 당신은 발견하고 '+ 비밀번호'와 같은 필드 선택을 통해 채우기 통화에서 필요로 당겨 수 있습니다. 예를 들면 :

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

    3.편집하다:

    편집하다:

    두 가지 접근 방식을 시도 후, 나는 항상 접근 방식은 여권 로컬 전략을 사용하고 어떤 이유로 나를 위해 작동하지 않는 제외 발견, 정말 이유를 알고하지 않습니다.

    그래서,이 내가 사용 결국 무엇을 :

    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 }
    
  4. ==============================

    4.User.find는 () ( '- 암호')를 선택합니다. 정답입니다. 그것이 작동하지 않습니다 때문에 당신이 로그인하려는 경우, 스키마에 거짓 : 당신은 선택을 추가 할 수 없습니다.

    User.find는 () ( '- 암호')를 선택합니다. 정답입니다. 그것이 작동하지 않습니다 때문에 당신이 로그인하려는 경우, 스키마에 거짓 : 당신은 선택을 추가 할 수 없습니다.

  5. ==============================

    5.당신은 예를 들어, 스키마를 사용하여 해당를 얻을 수 있습니다 :

    당신은 예를 들어, 스키마를 사용하여 해당를 얻을 수 있습니다 :

    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
    
  6. ==============================

    6.암호 필드를 가정하면 "비밀번호"당신은 그냥 할 수 있습니다 :

    암호 필드를 가정하면 "비밀번호"당신은 그냥 할 수 있습니다 :

    .exclude('password')
    

    여기에 좀 더 다양한 예제가있다

    그는 의견에 초점을 맞추고 있지만, 플레이 같은 원리입니다됩니다.

    투사 필드에이 {0 "암호"} MongoDB의에서 쿼리에 프로젝션을 사용하여 전달과 동일합니다. 여기를 봐

  7. ==============================

    7.내 REST JSON 응답에 숨어있는 암호 필드에 사용하고 있습니다

    내 REST JSON 응답에 숨어있는 암호 필드에 사용하고 있습니다

    UserSchema.methods.toJSON = function() {
     var obj = this.toObject(); //or var obj = this;
     delete obj.password;
     return obj;
    }
    
    module.exports = mongoose.model('User', UserSchema);
    
  8. ==============================

    8.이 솔루션은 일반 텍스트 암호를 저장하지 않습니다 것입니다. 당신은 bcrypt 또는 암호 해시 같은 패키지를 사용해야합니다.

    이 솔루션은 일반 텍스트 암호를 저장하지 않습니다 것입니다. 당신은 bcrypt 또는 암호 해시 같은 패키지를 사용해야합니다.

    해시 암호에 사용 예제 :

     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
    
  9. ==============================

    9.당신은 schema.toJSON () 또는 schema.toObject에 DocumentToObjectOptions 객체를 전달할 수 있습니다 ().

    당신은 schema.toJSON () 또는 schema.toObject에 DocumentToObjectOptions 객체를 전달할 수 있습니다 ().

    유형 / 몽구스 @에서 타이프 라이터의 정의를 참조 해주세요

     /**
     * The return value of this method is used in calls to JSON.stringify(doc).
     * This method accepts the same options as Document#toObject. To apply the
     * options to every document of your schema by default, set your schemas
     * toJSON option to the same argument.
     */
    toJSON(options?: DocumentToObjectOptions): any;
    
    /**
     * Converts this document into a plain javascript object, ready for storage in MongoDB.
     * Buffers are converted to instances of mongodb.Binary for proper storage.
     */
    toObject(options?: DocumentToObjectOptions): any;
    

    DocumentToObjectOptions는 자바 스크립트 객체로 문서를 변환 한 후 사용자 정의 함수를 실행하는 변환 옵션이 있습니다. 여기 숨기거나 당신의 필요를 채우기 위해 속성을 수정할 수 있습니다.

    자, 당신이 schema.toObject ()를 사용하는 가정 해 봅시다 당신은 당신의 사용자 스키마에서 암호 경로를 숨기려고합니다. 당신은 모든 toObject () 호출 후 실행됩니다 일반적인 변환 함수를 구성해야합니다.

    UserSchema.set('toObject', {
      transform: (doc, ret, opt) => {
       delete ret.password;
       return ret;
      }
    });
    
  10. ==============================

    10.Blogs.findOne ({_id : ID}, { "비밀 번호"0}).. 채우기 ( "사용자") 간부 인 ()

    Blogs.findOne ({_id : ID}, { "비밀 번호"0}).. 채우기 ( "사용자") 간부 인 ()

  11. ==============================

    11.암호를 사용하는 동안 {유형 : 문자열을 선택합니다 거짓을} 우리가 인증을 위해 그것을 필요로 할 때 당신이 또한 암호를 제외됩니다 있음을 알아 두셔야합니다. 그래서 당신이 원하는 그러나 그것을 처리 할 수 ​​있도록 준비.

    암호를 사용하는 동안 {유형 : 문자열을 선택합니다 거짓을} 우리가 인증을 위해 그것을 필요로 할 때 당신이 또한 암호를 제외됩니다 있음을 알아 두셔야합니다. 그래서 당신이 원하는 그러나 그것을 처리 할 수 ​​있도록 준비.

  12. ==============================

    12.이것은 더 원래의 질문에 대한 추론이지만, 이것은 내가 내 문제를 해결하기 위해 노력을 가로 질러왔다 질문했다 ...

    이것은 더 원래의 질문에 대한 추론이지만, 이것은 내가 내 문제를 해결하기 위해 노력을 가로 질러왔다 질문했다 ...

    즉, 암호 필드없이 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);
        });
    });
    
  13. ==============================

    13.나는 스키마 구성에 일부 설정을 추가하여,이 일을 다른 방법을 발견했다.

    나는 스키마 구성에 일부 설정을 추가하여,이 일을 다른 방법을 발견했다.

    const userSchema = new Schema({
        name: {type: String, required: false, minlength: 5},
        email: {type: String, required: true, minlength: 5},
        phone: String,
        password: String,
        password_reset: String,
    }, { toJSON: { 
                  virtuals: true,
                  transform: function (doc, ret) {
                    delete ret._id;
                    delete ret.password;
                    delete ret.password_reset;
                    return ret;
                  }
    
                }, timestamps: true });
    

    추가하여 제외 할 필드 이름으로 toJSON 객체로 변환 함수를. 명시된 문서에서 같은 :

  14. ==============================

    14.

    router.get('/users',auth,(req,res)=>{
       User.findById(req.user.id)
        //skip password
        .select('-password')
        .then(user => {
            res.json(user)
        })
    })
    
  15. from https://stackoverflow.com/questions/12096262/how-to-protect-the-password-field-in-mongoose-mongodb-so-it-wont-return-in-a-qu by cc-by-sa and MIT license