Tyl*_*ler 25 password-storage sequelize.js
我正在使用Sequelize为用户记录执行数据库查找,并且我希望模型的默认行为不返回该password记录的字段.该password字段是哈希,但我仍然不想返回它.
我有几个选项可以使用,但似乎没有一个特别好:
创建一个自定义的类方法findWithoutPassword的User模型和方法中做了User.find与attributes集如图所示Sequelize文档
做一个正常User.find并过滤控制器中的结果(不是首选)
使用其他库来去除不需要的属性
有没有更好的办法?最重要的是,如果有一种方法可以在Sequelize模型定义中指定永远不会返回该password字段,但我还没有找到一种方法.
Jan*_*ier 57
我建议覆盖toJSON函数:
sequelize.define('user', attributes, {
instanceMethods: {
toJSON: function () {
var values = Object.assign({}, this.get());
delete values.password;
return values;
}
}
});
Run Code Online (Sandbox Code Playgroud)
或者在sequelize v4中
const User = sequelize.define('user', attributes, {});
User.prototype.toJSON = function () {
var values = Object.assign({}, this.get());
delete values.password;
return values;
}
Run Code Online (Sandbox Code Playgroud)
toJSON 在将数据返回给用户时调用,因此最终用户将看不到密码字段,但它仍将在您的代码中可用.
Object.assign 克隆返回的对象 - 否则您将从实例中完全删除该属性.
Paw*_*ani 52
另一种方法是向User模型添加默认范围.
在模型的选项对象中添加它
defaultScope: {
attributes: { exclude: ['password'] },
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以创建单独的范围,仅在某些查询中使用它.
在模型的选项对象中添加它
scopes: {
withoutPassword: {
attributes: { exclude: ['password'] },
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以在查询中使用它
User.scope('withoutPassword').findAll();
Run Code Online (Sandbox Code Playgroud)
Lai*_*290 24
也许你可以exclude在你的属性中添加find,看起来像这样:
var User = sequelize.define('user', attributes);
User.findAll({
attributes: {
exclude: ['password']
}
});
Run Code Online (Sandbox Code Playgroud)
阅读文档了解更多详情
Mat*_*ley 13
我喜欢结合使用Pawan的两个答案,并声明如下:
defaultScope: {
attributes: { exclude: ['password'] },
},
scopes: {
withPassword: {
attributes: { },
}
}
Run Code Online (Sandbox Code Playgroud)
这允许我默认排除密码并使用withPassword范围在需要时显式返回密码,例如在运行登录方法时.
userModel.scope('withPassword').findAll()
Run Code Online (Sandbox Code Playgroud)
这确保了在通过引用字段包括用户时不返回密码,例如
accountModel.findAll({
include: [{
model: userModel,
as: 'user'
}]
})
Run Code Online (Sandbox Code Playgroud)
下面的代码对我有用。我们希望在运行时访问实例属性,但在将数据发送到客户端之前删除它们。
const Sequelize = require('sequelize')
const sequelize = new Sequelize('postgres://user:pass@example.com:5432/dbname')
const PROTECTED_ATTRIBUTES = ['password', 'token']
const Model = Sequelize.Model
class User extends Model {
toJSON () {
// hide protected fields
let attributes = Object.assign({}, this.get())
for (let a of PROTECTED_ATTRIBUTES) {
delete attributes[a]
}
return attributes
}
}
User.init({
email: {
type: Sequelize.STRING,
unique: true,
allowNull: false,
validate: {
isEmail: true
}
},
password: {
type: Sequelize.STRING,
allowNull: false
},
token: {
type: Sequelize.STRING(16),
unique: true,
allowNull: false
},
},
{
sequelize,
modelName: 'user'
})
module.exports = UserRun Code Online (Sandbox Code Playgroud)
我可以通过向返回的字段添加一个 getter 来实现此功能undefined
firstName: {
type: DataTypes.STRING,
get() {
return undefined;
}
}
Run Code Online (Sandbox Code Playgroud)
当模型包含在另一个模型中时,接受的答案不起作用。
我有一个虚拟字段,fullName这取决于我想隐藏的字段,比如firstName和lastName。并且基于的解决方案defaultScope在这种情况下不起作用。
| 归档时间: |
|
| 查看次数: |
14281 次 |
| 最近记录: |