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

SailsJS policy on request method rather than route

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

我会想象像这样:

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

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

我现在正在使用 Sails 1.0。

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

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

module.exports = function(req,res, next) {
    if(ACLService.hasPermission(req.user.acl, 'admin')) {
        //Ok to allow delete here
    } else {
        return res.unauthorized();
    }
};

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

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

您可能需要添加此钩子以覆盖 1.0 中的蓝图

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

这里有一个方法你可以使用,我并不是说它是正确的方法,但是你可以考虑一下:

你可以写你自己的钩子。如何做到这一点:https://sailsjs.com/documentation/concepts/extending-sails/hooks/project-hooks

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

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

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

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();