从策略范围获取sails请求目标

我目前尝试基于sails提供的策略系统为sails(v0.10)应用程序设置一个简单的授权系统(已经存在身份validation)。 为此,我需要从我的策略中获取控制器和操作当前的请求目标。

我在政策上大致做了以下几点:

module.exports = function (req, res, next) { // Get target controller and action var target = req.target; // How to do this? var action = req.action; // and this? // Lookup in database, let through if matches or render error User.findOne... }; 

我记得目标信息在某个时间点被embedded到了请求对象中,但现在还没有find(commit 5d98ec8 )。

我意识到有可能通过模拟sails路由器来parsingreq.route并获取所需的信息,但是我宁愿避免重复路由逻辑的唯一目的。

编辑:

控制器标识可以像这样从请求对象中检索:

 var controller = req.options.controller || req.options.model; 

示例req.options:

 { detectedVerb: { verb: '', original: '/user/:id?', path: '/user/:id?' }, associations: [ { alias: 'auth', type: 'model', model: 'key' }, { alias: 'group', type: 'model', model: 'group' }, { alias: 'role', type: 'model', model: 'role' } ], actions: true, rest: true, shortcuts: true, prefix: '', pluralize: false, index: true, model: 'user' } 

仍然寻找一个理智的方式来获得目标pipe制员的行动。

  • 相关问题: https : //github.com/balderdashy/sails/issues/1372
  • 关联Google网上论坛发帖: https ://groups.google.com/forum/#! topic/ sailsjs/ faX54hqcNZE

基于对Github问题的反馈,我决定将目标操作/目标蓝图查找作为自定义服务, sails.hooks.blueprintssails.hooks.blueprintsfind的路由绑定。

用法:

 var action = Utility.getRequestAction(req); 

服务定义:

 /** * api/services/Utitlity.js * * @module Service * @name Utility * @memberOf global * @description Utilities for various common tiny tasks * @docs http://sailsjs.org/#!documentation/services * @api public **/ /** * Module dependencies */ var util = require('util'), _ = require('lodash'); module.exports = { getRequestAction: function (req) { if (req.options.action) return req.options.action; var controller = req.options.controller || req.options.model; var baseRoute = sails.config.blueprints.prefix + controller; var requestRoute = req.route.method + ' ' + req.route.path; var Model = sails.models[controller]; if (req.options.shortcuts && Model) { var shortcutRoutes = { '/%s/find/:id?': 'find', '/%s/create': 'create', '/%s/update/:id?': 'update', '/%s/destroy/:id?': 'destroy' }; var shortcutAction = _.findWhere(shortcutRoutes, function(blueprint, pattern){ var shortcutRoute = util.format(pattern, baseRoute); return req.route.path === shortcutRoute; }); if (shortcutAction) return shortcutAction; } if (req.options.rest && Model) { var restRoutes = { 'get /%s/:id?': 'find', 'post /%s': 'create', 'put /%s/:id?': 'update', 'delete /%s/:id?': 'destroy' }; var restAction =_.findWhere(restRoutes, function(blueprint, pattern){ var restRoute = util.format(pattern, baseRoute); return requestRoute === restRoute; }); if (restAction) return restAction; var associationActions = _.compact(_.map(req.options.associations, function(association){ var alias = association.alias; var associationRoutes = { 'get /%s/:parentid/%s/:id?': 'populate', 'post /%s/:parentid/%s': 'add', 'delete /%s/:parentid/%s': 'remove' }; return _.findWhere(associationRoutes, function(blueprint, pattern){ var associationRoute = util.format(pattern, baseRoute, alias); return requestRoute === associationRoute; }); })); if (associationActions.length > 0) return associationActions[0]; } } };