关于请求方法而不是路由的 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://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();
有什么方法可以触发针对特定请求方法(例如 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://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();