2015-08-23 17 views
5

Chcę zapisać hashowane hasło. Używam narzędzia SetterMethod:Jak mogę uruchomić sprawdzanie poprawności modelu przed setterMethod w Sequelize?

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) 

Seter działa jako pierwszy. Puste hasło ciągu znaków ('') jest mieszane w niepusty (powiedzmy $2a$10$pDDIGnV.r47i9YOv0Fls/euQ0yYvfyq8T1SyP9VRQsTUAqptNmxXO).

Po sprawdzeniu poprawności hasło nie jest już puste.

Jak mogę sprawdzić hasło przed ustawiaczem?

Zajrzałem do hooks, ale nie wspominają też o seterach.

Używam [email protected].

Odpowiedz

0

Rozwiązałem ten problem, używając dwóch pól, z których jeden to typ VIRTUAL, który obsługuje dane wejściowe i sprawdzanie poprawności, a drugi to typ STRING, który przechowuje hashowane hasło.

Ten przykład nie jest coffeescript, ale powinieneś być w stanie łatwo przetłumaczyć.

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.', 
    }, 
    }, 
}, 

Podczas uwierzytelnienia użytkownika porównać wprowadzone hasło do User.password_hash zamiast User.password.

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

Następnie można wywołać metodę tej instancji, aby uwierzytelnić numer User.

User.findById(userId) 
.then((user) => { 
    if (user.authenticate(password)) { 
    console.log('Authenticated'); 
    } else { 
    console.log('Not authenticated'); 
    } 
}); 
Powiązane problemy