[MONGODB] 내가 컬렉션을 채울 때 쿼리에서 반환하지 않도록하는 방법 몽구스 / MongoDB를에서 암호 필드를 보호하기 위해?
MONGODB내가 컬렉션을 채울 때 쿼리에서 반환하지 않도록하는 방법 몽구스 / MongoDB를에서 암호 필드를 보호하기 위해?
내가 / 스키마를 두 개의 컬렉션이 있다고 가정. 하나는, 내가 저자 필드에 사용자 스키마에 대한 참조가있는 블로그 스키마를 가지고, 사용자 이름 및 암호 필드와 사용자 스키마입니다. 내가 좋아하는 뭔가를 할 몽구스를 사용하는 경우
Blogs.findOne({...}).populate("user").exec()
나는 블로그 문서와도 채워 사용자를 가지고 있지만, 어떻게 암호 필드를 반환에서 몽구스 / MongoDB를 방지 할 것인가? 암호 필드는 해시되어 있지만 반환 할 수 없습니다.
나는 암호 필드를 생략하고 간단한 쿼리의 필드의 나머지를 반환 할 수 있습니다 알고 있지만, 어떻게 채울으로 그렇게 않습니다. 또한,이 작업을 수행하는 어떤 우아한 방법은 무엇입니까?
또한, 어떤 상황에서 나는 사용자가 로그인을 원할 때처럼, 암호 필드를 얻거나 암호를 변경할 필요가 없습니다.
해결법
-
==============================
1.
.populate('user' , '-password')
http://mongoosejs.com/docs/populate.html
스키마 옵션을 사용하여 JohnnyHKs의 대답은 아마 여기에 갈 수있는 방법입니다.
또한 () 만 2.x는 지점에 존재하는 query.exclude을 확인합니다.
-
==============================
2.당신은 필드의 선택 속성을 사용하여 스키마 정의 수준에서 기본 동작을 변경할 수 있습니다 :
당신은 필드의 선택 속성을 사용하여 스키마 정의 수준에서 기본 동작을 변경할 수 있습니다 :
password: { type: String, select: false }
그럼 당신은 발견하고 '+ 비밀번호'와 같은 필드 선택을 통해 채우기 통화에서 필요로 당겨 수 있습니다. 예를 들면 :
Users.findOne({_id: id}).select('+password').exec(...);
-
==============================
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.User.find는 () ( '- 암호')를 선택합니다. 정답입니다. 그것이 작동하지 않습니다 때문에 당신이 로그인하려는 경우, 스키마에 거짓 : 당신은 선택을 추가 할 수 없습니다.
User.find는 () ( '- 암호')를 선택합니다. 정답입니다. 그것이 작동하지 않습니다 때문에 당신이 로그인하려는 경우, 스키마에 거짓 : 당신은 선택을 추가 할 수 없습니다.
-
==============================
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.암호 필드를 가정하면 "비밀번호"당신은 그냥 할 수 있습니다 :
암호 필드를 가정하면 "비밀번호"당신은 그냥 할 수 있습니다 :
.exclude('password')
여기에 좀 더 다양한 예제가있다
그는 의견에 초점을 맞추고 있지만, 플레이 같은 원리입니다됩니다.
투사 필드에이 {0 "암호"} MongoDB의에서 쿼리에 프로젝션을 사용하여 전달과 동일합니다. 여기를 봐
-
==============================
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.이 솔루션은 일반 텍스트 암호를 저장하지 않습니다 것입니다. 당신은 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.당신은 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.Blogs.findOne ({_id : ID}, { "비밀 번호"0}).. 채우기 ( "사용자") 간부 인 ()
Blogs.findOne ({_id : ID}, { "비밀 번호"0}).. 채우기 ( "사용자") 간부 인 ()
-
==============================
11.암호를 사용하는 동안 {유형 : 문자열을 선택합니다 거짓을} 우리가 인증을 위해 그것을 필요로 할 때 당신이 또한 암호를 제외됩니다 있음을 알아 두셔야합니다. 그래서 당신이 원하는 그러나 그것을 처리 할 수 있도록 준비.
암호를 사용하는 동안 {유형 : 문자열을 선택합니다 거짓을} 우리가 인증을 위해 그것을 필요로 할 때 당신이 또한 암호를 제외됩니다 있음을 알아 두셔야합니다. 그래서 당신이 원하는 그러나 그것을 처리 할 수 있도록 준비.
-
==============================
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.나는 스키마 구성에 일부 설정을 추가하여,이 일을 다른 방법을 발견했다.
나는 스키마 구성에 일부 설정을 추가하여,이 일을 다른 방법을 발견했다.
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.
router.get('/users',auth,(req,res)=>{ User.findById(req.user.id) //skip password .select('-password') .then(user => { res.json(user) }) })
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
'MONGODB' 카테고리의 다른 글
[MONGODB] 동일한 서버에 MongoDB를의 여러 인스턴스 (0) | 2019.12.07 |
---|---|
[MONGODB] Mongoose.js는 : 사용자 이름 LIKE 값으로 사용자를 찾습니다 (0) | 2019.12.07 |
[MONGODB] 몽구스 _id 문자열 비교 (0) | 2019.12.07 |
[MONGODB] 'MODULE_NOT_FOUND'} JS-bson : 모듈 '../build/Release/bson'] 코드를 찾을 수 없습니다 부하 C ++ bson 확장, 순수 JS 버전을 사용하여 실패 (0) | 2019.12.07 |
[MONGODB] 몽구스 (MongoDB를) 일괄 삽입? (0) | 2019.12.07 |