如何使用策略筛选Sails.js蓝图查询

How can I filter Sails.js blueprint queries using a policy?

本文关键字:查询 js Sails 何使用 策略 筛选      更新时间:2023-10-06

我有一个isAuthorized策略,如果用户被授权对给定的模型和模型实例执行给定的操作,该策略将返回true。

有没有办法将此策略应用于蓝图路由,例如,对file的GET请求只返回允许当前用户执行findOne的文件?

同样,这个相同的策略是否可以应用于蓝图填充结果,从而在填充的数组中只返回一些用户的关联文件?

为了做到这一点,我目前正在覆盖每个控制器中的find操作,这不是理想的。如果它可以在不破坏蓝图路线/行动的情况下使用政策来应用,那将是非常棒的。

在我的sails权限模块中,我覆盖sails.js response类型,以便控制器只使用允许用户访问的模型进行响应。

参见:

  • 超控响应:https://github.com/tjwebb/sails-permissions/blob/master/api/policies/PermissionPolicy.js#L58
  • 筛选结果:https://github.com/tjwebb/sails-permissions/blob/master/api/policies/PermissionPolicy.js#L86-L90

这是帆的一部分,也许是一个新功能?

http://sailsjs.com/documentation/concepts/policies#?using-政策与蓝图行动

{
  UserController: {
      find: ['isAuthorized', 'filterByUserId'],
      findOne: ['isAuthorized', 'filterByUserId']
  }
}

api/policies/filterByUserId.js

module.exports = function filterByUserId(req, res, next) {
    if ( req.session.user ){
        // Use existing req.options.where, or initialize it to an empty object
        req.options.where = req.options.where || {};
        // Set the default `userId`
        req.options.where.id = req.session.user.id;
    }
    //safe to do if isAuthorized policy is enforced in tandem.
    return next();
}