2016-03-03 4 views
0

У меня есть модель: api/models/Agency.jsSailsJs Защита Blueprints с политиками

attributes: { 

     // attributes for agency 

     // One agency can have many owners 
     owners: { 

      collection: 'user', 
      required: true, 
      via: 'agencies' 
     }, 

     employees: { 

      collection: 'user', 
      via:   'employer' 
     } 
    } 

Модель имеет многие ко многим отношения с пользователями; так как многие пользователи могут владеть многими агентствами.

Я хочу защитить контроллер Blueprint для агентства (AgencyController.js) с Политикой называется isOwner.js; который гарантирует, что Пользователь является владельцем Агентства, прежде чем разрешить им редактировать. Я основывал политику на примере, найденном в Sails.js docs, где я пытаюсь гарантировать, что userId (найденный в сеансе) является владельцем ресурса.

api/policies/isOwner.js:

module.exports = function(req, res, next) { 

    var userId = req.session.passport.user; 

    req.options.where = req.options.where || {}; 

    req.options.where.owners = userId; 

    return next(); 

}; 

Тогда в моем config/policies.js файл я добавил следующее:

AgencyController: { 

      destroy: ['isOwner'], 
      update: ['isOwner'] 
    }, 

Это не работает. Я думаю, это из-за многих-многих отношений между двумя моделями. Мой вопрос: могу ли я создать политику, которая может запрашивать отношения многих или многих? Или это возможно только в отношениях от одного до многих?

Спасибо.

ответ

0

Я не смог найти способ хорошо защитить методы чертежа только политикой, поэтому я создал службу, которая проверила пользователя, была владельцем модели, а затем расширила методы обновления и уничтожения в моем контроллере.

API/услуги/isOwner.js:

/** 
* Only allow access to models if they are the owner. 
* Assumes an attribute called owners on the model and assumes it has a relationship that can be queried through the 
* 'populate' waterline method. 
*/ 
var actionUtil = require('sails/lib/hooks/blueprints/actionUtil'); 
var _ = require('underscore'); 

/** 
* @param req 
* @param res 
* @param is {function} called if the user is the owner 
* @param isnt {function} called if the user is not the owner. If not present will redirect 403 not authorised. 
*/ 
module.exports = function isOwner(req, res, is, isnt){ 

    var ownerEmail = req.options.where.owner; 
    var Model = actionUtil.parseModel(req); 

    isnt = isnt || res.forbidden; 

    is = is || function(){ 

      sails.log.warn('No callback defined for isOwner'); 
      res.ok(); 
     }; 


    Model.findOne({ id: req.params.id }).populate('owners').exec(function(error, model){ 

     var canEdit = _.find(model.owners, function(owner){ 

      return owner.email === ownerEmail; 
     }); 

     canEdit ? is() : isnt(); 
    }); 
}; 

API/контроллеры/AgencyController.js:

var update = require('sails/lib/hooks/blueprints/actions/update'); 
var isOwner = require('../services/isOwner'); 

module.exports = { 

    /** 
    * Override the default blueprint update behaviour so only the owner can update a record. 
    * 
    * @param req 
    * @param res 
    */ 
    update: function(req, res){ 

     isOwner(req, res, update); 
    } 
}; 

не чувствует, как самый хороший способ сделать это, но это единственный способ Я мог подумать. Просто подумал, что я бы поделился этим здесь, просто заставляя кого-то сталкиваться с той же проблемой, или у кого-то есть лучшее решение.

Смежные вопросы