Ограничение установки полей в модели Sails.js

Итак, у меня есть модель с некоторыми полями:

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

Я использую структуру плана Sails, поэтому она автоматически отображает все. Однако иногда у меня есть такие поля, как loggedinAt, которые являются строго внутренними, и я не хочу, чтобы пользователь мог их установить.

В нынешнем виде, если я отправлю запросы на публикацию с полем loggedinAt, оно будет установлено. Как я могу ограничить это?


person Rob    schedule 04.06.2014    source источник


Ответы (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"
}
person sgress454    schedule 04.06.2014
comment
Это похоже на то, что нужно проделать небольшую работу для каждого параметра, возможно, лучше будет просто игнорировать его. Например, если я просто установлю что-то вроде blahb=blah, эффекта не будет. - person Rob; 04.06.2014
comment
Ах хорошо. В мой ответ добавлена ​​информация о черном списке в Sails v0.10.x. В v0.9.x вам нужно было бы просто переопределить действие создания в вашем контроллере. - person sgress454; 04.06.2014
comment
Наткнулся на это здесь, и это больше того, что я ищу, однако это только работает в новейшей версии 0.10.x. - person Rob; 04.06.2014
comment
Удаление элементов из req.params в политике ненадежно, поскольку Sails привязывает параметры отдельно к каждому промежуточному программному обеспечению. Вот почему req.options был изобретен. Черный список должен работать с любой версией v0.10.x. - person sgress454; 04.06.2014
comment
Мой req.options приближается undefined...? - person Rob; 04.06.2014
comment
Хм, код выше работает для меня. Вы используете его в политике? - person sgress454; 04.06.2014