首页 文章

Sequelize:不要返回密码

提问于
浏览
19

我正在使用Sequelize为用户记录执行数据库查找,我希望模型的默认行为 not 返回该记录的 password 字段 . password 字段是一个哈希,但我仍然不想返回它 .

我有几个选项可以使用,但似乎没有一个特别好:

  • User 模型创建自定义类方法 findWithoutPassword ,并在该方法中执行 User.find 并设置 attributes ,如Sequelize docs所示

  • 执行正常 User.find 并过滤控制器中的结果(不是首选)

  • 使用其他库来去除不需要的属性

有没有更好的办法?最重要的是如果有一种方法可以在Sequelize模型定义中指定永远不会返回 password 字段,但我还没有找到方法来做到这一点 .

5 回答

  • 23

    另一种方法是向User模型添加默认范围 .

    在模型的选项对象中添加它

    defaultScope: {
      attributes: { exclude: ['password'] },
    }
    

    或者,您可以创建单独的范围,仅在某些查询中使用它 .

    在模型的选项对象中添加它

    scopes: {
      withoutPassword: {
        attributes: { exclude: ['password'] },
      }
    }
    

    然后,您可以在查询中使用它

    User.scope('withoutPassword').findAll();
    
  • 0

    也许你可以在 find 时在你的属性上添加 exclude ,如下所示:

    var User = sequelize.define('user', attributes);
    
    User.findAll({
        attributes: {
            exclude: ['password']
        }
    });
    

    阅读docs了解更多详情

  • 36

    我喜欢结合使用Pawan的两个答案,并声明如下:

    defaultScope: {
        attributes: { exclude: ['password'] },
    },
    scopes: {
        withPassword: {
            attributes: { },
        }
    }
    

    这允许我默认排除密码,并在需要时使用 withPassword 范围显式返回密码,例如在运行登录方法时 .

    userModel.scope('withPassword').findAll()
    

    这确保了在通过引用字段包括用户时不返回密码,例如,

    accountModel.findAll({
        include: [{
            model: userModel,
            as: 'user'
        }]
    })
    
  • 53

    scoping attributes的插件,正如here所讨论的那样 .

    我接受了在接受的答案中提到的覆盖,除了我调用原始的 toJSON 而不是 getthis.constructor.super_.prototype.toJSON.apply(this, arguments) ,如api docs所述

  • 7

    我建议覆盖 toJSON 函数:

    sequelize.define('user', attributes, {
      instanceMethods: {
        toJSON: function () {
          var values = Object.assign({}, this.get());
    
          delete values.password;
          return values;
        }
      }
    });
    

    或者在sequelize v4中

    const User = sequelize.define('user', attributes, {});
    
    User.prototype.toJSON =  function () {
      var values = Object.assign({}, this.get());
    
      delete values.password;
      return values;
    }
    

    数据返回给用户时会调用 toJSON ,因此最终用户将看不到密码字段,但代码中仍会显示该密码字段 .

    Object.assign 克隆返回的对象 - 否则您将从实例中完全删除该属性 .

相关问题