SailsJS策略请求方法而不是路由

时间:2018-04-04 10:01:12

标签: javascript node.js sails.js

有什么方法可以针对特定的请求方法(例如DELETE)触发策略而不是特定的路由?

想象这样的事情:

module.exports.policies = {
   'DELETE *': 'isAdmin'
}

我的目标是仅向管理员公开蓝图api,以便我可以将其保留在生产中,因为它是一个非常有用的工具,允许第三方脚本添加额外的功能。

我现在正在使用Sails 1.0。

这样做的一种方法可能是将请求方法的检查添加到实际的管理策略中,但这对我来说似乎不是最好的解决方案。

2 个答案:

答案 0 :(得分:2)

您可以覆盖特定方法的所有模型的蓝图。您可以通过在/ api / blueprints /中创建文件destroy.js然后在DELETE通过时添加您想要执行的操作的代码来为DELETE执行此操作:

int

这就是我过去的做法,但是看看刚刚发布的SailsJS 1.0的文档:

https://sailsjs.com/documentation/reference/blueprint-api

您可能需要添加此挂钩以覆盖1.0

中的蓝图

https://www.npmjs.com/package/sails-hook-custom-blueprints

答案 1 :(得分:1)

以下是您可以使用的一种方法,我并不是说这是正确的方法,但您可以考虑它:

你可以写自己的钩子。怎么做:https://sailsjs.com/documentation/concepts/extending-sails/hooks/project-hooks

基本上这是带钩子的解决方案:

1在api文件夹下创建一个hooks文件夹。

2在hooks文件夹中创建另一个文件夹 - 名称将是你的钩子的名称(比如我的钩子)。

3在api / hooks / my-hook中创建一个文件index.js并在其中输入以下代码:

module.exports = function myHook(sails) {
  return {
    routes: {
      before: {
        '/*': function (req, res, next) {
          if (req.method.toUpperCase() === 'DELETE') {
            return sails.hooks.policies.middleware.isadmin(req, res, next); // note - your policy function name must be called here with all lowercase, otherwise it will not work.
          }

          return next();
        }
      }
    }
  };
};

然后在您的isAdmin.js政策中,您可以检查您的用户是否是管理员,如果不是:

return res.forbidden();

如果是管理员:

return next();
相关问题