如何在Sails中自动将模型过滤器应用于GET请求

时间:2016-12-05 17:59:26

标签: sails.js

我希望所有对Sails生成的API的所有HTTP GET请求都受到限制。那么如何将过滤器应用于所有传入的API GET请求。

更具体地说,我的大多数模型都有一个名为publicityLevel的属性。这表明模型是否公开。所以我希望我的所有模型都自动为所有传入的GET请求应用过滤器(如publicityLevel: 'public')。

更高级,我想编写一些代码来决定用户是否可以看到特定的模型。因此,如果用户是管理员,请不要应用此过滤器。如果用户不是管理员,请应用此过滤器。

1 个答案:

答案 0 :(得分:0)

我有类似的问题要用蓝图解决,我解决了。

如果我们谈论BLUEPRINTS:

使用蓝图时,您可以从modelName获得req.options.model。 我用它来检查用户是否属于与元素相同的组。

不幸的是,您无法使用this[modelName],因为选项会以小写字母开头给您模型名称,因此首先您必须使用例如大写的第一个字母。 var modelName = req.options.model.charAt(0).toUpperCase() + req.options.model.slice(1);

然后您可以自由使用this[modelName].whateverYouNeed

我将它用于通用策略,让用户只编辑自己的组元素。

var modelName = req.options.model.charAt(0).toUpperCase() + req.options.model.slice(1)
  var elementID = null

  if (req.params.id) { // To handle DELETE, PUT
    elementID = req.params.id
  }
  if (req.body.id) { // To handle POST
    elementID = req.body.id
  }

  this[modelName].findOne({
    id: elementID
  }).exec(function(err, contextElement) {
    if(err) {
      return res.serverError(err)
    }
    if(contextElement.group=== req.user.group.id) {
      sails.log('accessing own: ' + modelName)
      return next()
    }
    else {
      return res.forbidden('Tried to access not owned object')
    }
  })