【问题标题】:How to update a hashed password with validation in Waterline?如何在 Waterline 中通过验证更新散列密码?
【发布时间】:2014-07-31 23:22:58
【问题描述】:

Waterline 文档给出了使用beforeCreate 对密码进行哈希处理的示例。除非您在密码字段上进行了验证并尝试更新记录,否则这非常有效。这是我截取的示例:

types: {
    hasUpperCase: function (value) {
        return value.search(/[A-Z]/) != -1;
    },
    hasLowerCase: function (value) {
        return value.search(/[a-z]/) != -1;
    },
    hasNumber: function (value) {
        return value.search(/[0-9]/) != -1;
    }
},
attributes: {
    password: {
        type: 'string',
        minLength: 8,
        hasUpperCase: true,
        hasLowerCase: true,
        hasNumber: true
    }, 
    salt: {
        type: 'string'
    },
    // ...
}
beforeCreate: function (values, next) {
    // Encrypt the password and record the salt.
    psalty.createHash(values.password)
        .then(function (psalt) {
            values.password = psalt.hash;
            values.salt = psalt.salt;
            next();
        })
        .done(null, next);
},

当我来更新记录时,我收到一个验证错误,例如:

{"password":[
    {"rule":"hasUpperCase","message":"\"hasUpperCase\" validation rule failed for input: 'b7d58848e4eb40ec78e756d1302ef7aeb628841a40273d2465713d2231faab396669ec7bdab91c75eaf999064cfc9c3110b1211f24fbab626619730dcadfaee069b58cb4b64e6b57d1ba7c73c22d683eb783f04439c5b0d198b56d52c219c4eab35bd7b0d56696242f4be0ac70082d6dafc65d6d2f578b22ad292582fb973f'"}]
}

所以这里有几个问题。

第一个是当保存记录以更新另一个字段时(假设它是一个用户表并且他们正在更改他们的个人资料信息),当前哈希必须保持不变。

第二个问题是当现有用户想要更新现有记录中的密码时,我们需要能够重新散列密码。

有没有人单独使用 Sails 或 Waterline 提出了很好的模型策略来处理这些类型的情况?我的假设是我将不得不将验证转移到事件处理程序之一。

提前致谢。

【问题讨论】:

    标签: sails.js waterline


    【解决方案1】:

    检查此文件:

    https://github.com/vimia/sails-core/blob/master/api/models/User.js

    你将把盐和密码放在一起......

    【讨论】:

    • 所以要实现“必须包含一个大写字母和一个数字”之类的密码策略,您将不得不以某种方式手动检查,对吗?
    • 你如何在你的控制器中调用这些?
    猜你喜欢
    • 2016-12-19
    • 2020-02-29
    • 1970-01-01
    • 2020-06-06
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 2016-05-22
    相关资源
    最近更新 更多