2015-08-23 3 views
5

मैं एक हैश पासवर्ड सहेजना चाहता हूं। मैं इसके लिए एक setterMethod का उपयोग कर रहा हूं:Sequelize में setterMethod से पहले मैं मॉडल सत्यापन कैसे चला सकता हूं?

module.exports = (sequelize, DataTypes) -> 
    sequelize.define 'User', 
    # other model fields [...] 
    password: 
     type: DataTypes.STRING 
     validate: notEmpty: msg: 'You need to set a password.' 
     set: (pw) -> 
     salt = bcrypt.genSaltSync(10) 
     hash = bcrypt.hashSync(pw, salt) 
     @setDataValue('password', hash) 

सेटटर पहले चलता है। एक खाली स्ट्रिंग पासवर्ड ('') एक गैर-खाली में धोया गया है ($2a$10$pDDIGnV.r47i9YOv0Fls/euQ0yYvfyq8T1SyP9VRQsTUAqptNmxXO कहें)।

जब वैधकर्ता मान्य करता है, तो पासवर्ड अब खाली नहीं होता है।

मैं सेटटर से पहले पासवर्ड कैसे सत्यापित कर सकता हूं?

मैंने hooks में देखा लेकिन वे सेटर्स का भी उल्लेख नहीं करते हैं।

मैं [email protected] का उपयोग कर रहा हूं।

उत्तर

0

मैंने दो क्षेत्रों का उपयोग करके इस समस्या को हल किया, एक प्रकार VIRTUAL है जो इनपुट और सत्यापन को संभालता है, और एक STRING टाइप किया गया है जिसमें हैश पासवर्ड है।

यह उदाहरण coffeescript नहीं है लेकिन आप आसानी से अनुवाद करने में सक्षम होना चाहिए।

password_hash: { 
    type: DatabaseTypes.STRING, 
    allowNull: false, 
    validate: { 
    notEmpty: true, 
    }, 
}, 
password: { 
    type: DatabaseTypes.VIRTUAL, 
    allowNull: false, 
    // note that arrow functions cannot access "this", so use the form: 
    set: function setPassword(val) { 
    // trigger validation on "password" field 
    this.setDataValue('password', val); 

    // hash the password, this can be done in one step by passing the 
    // number of salt rounds instead of the salt string. 
    this.setDataValue('password_hash', bcrypt.hashSync(val, 10)); 
    }, 
    validate: { 
    notEmpty: { 
     message: 'You need to set a password.', 
    }, 
    }, 
}, 

जब आप उपयोगकर्ता को प्रमाणित User.password_hash बजाय User.password में प्रवेश पासवर्ड की तुलना करें।

instanceMethods: { 
    // authenticate user given a password 
    authenticate(password) { 
    return bcrypt.compareSync(password, this.password_hash); 
    }, 
}, 

फिर आप एक User प्रमाणित करने के लिए इस उदाहरण विधि कॉल कर सकते हैं।

User.findById(userId) 
.then((user) => { 
    if (user.authenticate(password)) { 
    console.log('Authenticated'); 
    } else { 
    console.log('Not authenticated'); 
    } 
}); 
संबंधित मुद्दे

 संबंधित मुद्दे