【问题标题】:Restricting fields from being set in Sails.js Model限制在 Sails.js 模型中设置的字段
【发布时间】:2014-06-04 16:02:26
【问题描述】:

所以我有一个包含一些字段的模型:

// ...
slug: {
  type: 'string',
  required: true,
  alphanumeric: true,
  minLength: 3,
  maxLength: 16
},
loggedinAt: 'date',
// ...

我正在使用 Sails 蓝图结构,因此它会自动映射所有内容。但是,有时我有像 loggedinAt 这样的字段,它们是严格内部的,我不希望它们能够由用户设置。

就目前而言,如果我使用loggedinAt 字段发出帖子请求,它将设置它。我该如何限制呢?

【问题讨论】:

    标签: node.js mongodb express sails.js waterline


    【解决方案1】:

    您可以使用策略来限制这种行为。在 api/policies/restrictUserCreate.js

    module.exports = function (req, res, next) {
    
        // Check for the "loggedInAt" field in the request
        if (req.param('loggedInAt')) {
           return res.badRequest("Nuh uh, you can't set that!");
        }
    
        return next();
    
    }
    

    或者,要忽略某些字段(仅限 Sails v0.10.x),请使用 黑名单

    module.exports = function (req, res, next) {
    
        // Make sure blacklist object exists, and use existing one if possible,
        // since this policy could be chained
        req.options.values = req.options.values || {};
        req.options.values.blacklist = req.options.values.blacklist || [];
        // Add restricted fields to the blacklist
        req.options.values.blacklist.push('loggedinAt');
        return next();
    
    }
    

    然后在 config/policies.js 中:

    // Assuming your controller is "UserController"
    UserController: {
        create: "restrictUserCreate"
    }
    

    【讨论】:

    • 这似乎对每个参数都做了一些工作,也许更好的措辞是忽略它。例如,如果我只设置“blahb=blah”之类的内容,则没有效果。
    • 啊,好的。在我的答案中添加了有关 Sails v0.10.x 中黑名单的信息。在 v0.9.x 中,您只需覆盖控制器中的“创建”操作。
    • 遇到了这个here,这正是我想要的,但它只适用于 0.10.x 的前沿版本。
    • 在策略中从req.params 中删除项目是不可靠的,因为 Sails 将参数分别绑定到每个中间件。这就是发明req.options 的原因。黑名单应该适用于 v0.10.x 的任何版本。
    • 我的 req.options 即将上线 undefined...?
    猜你喜欢
    • 2015-02-27
    • 2014-01-23
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 2011-11-06
    相关资源
    最近更新 更多