2016-12-05 8 views
0

Я хочу, чтобы все HTTP-запросы HTTP API, сгенерированные Sails, были ограничены. Итак, как я могу применить фильтр ко всем входящим запросам API GET.Как я могу автоматически применять фильтры модели для запросов GET в Sails

В частности, большинство моих моделей имеют атрибут publicityLevel. Это говорит о том, является ли модель открытой или нет. Поэтому я хочу, чтобы все мои модели автоматически применяли фильтр (например, publicityLevel: 'public') для всех входящих запросов GET.

Еще более продвинутый, я хотел бы написать код, который определяет, может ли пользователь видеть конкретную модель или нет. Поэтому, если пользователь является администратором, не применяйте этот фильтр. Если пользователь не является администратором, примените этот фильтр.

ответ

0

У меня была аналогичная проблема для решения с чертежами, и я решил это.

Если мы говорим о BluePrints:

Вы можете получить modelName от req.options.model при использовании Blueprints. Я использовал его, чтобы проверить, принадлежит ли пользователь к той же группе, что и элемент.

К сожалению, вы не можете использовать 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') 
    } 
    }) 
+0

Является ли это обработчиком маршрута? Куда будет идти этот код? – AskYous

+0

ой. Сожалею! Это ПОЛИТИКА. –